Como verificar se o arquivo2 é mais recente que o arquivo1 no bash?

51

Como posso verificar file2se a última modificação foi feita depois file1?

Neste exemplo, perlfoi modificado mais recentemente que stack. Existe um comando bash ou Linux que pode comparar esses arquivos com base no tempo de modificação?

-rw-r--r--    1 root     root         1577 Sep  7 22:55 stack
-rwxr-xr-x    1 root     root          626 Sep  7 23:10 perl
lidia
fonte

Respostas:

51

Encontrei aqui

for f in /abcd/xyz* do
   [ "$f" -nt /abcd/test.txt ] && echo "file f$ found" done
subanki
fonte
14
Também -oté "mais antigo que".
Dennis Williamson
1
Acho que acabei de ter um problema com isso. Para arquivos com o mesmo tempo de modificação em segundos, eles têm a "mesma" idade desses testes; -nt e -ot dão o mesmo resultado (false). No meu caso de uso, tenho um programa lendo a saída de outros e preciso ter certeza de que eles foram executados na ordem correta. Nesse caso, parece necessário comparar nanossegundos.
sjmc
38
if [[ FILE1 -nt FILE2 ]]; then
  echo FILE1 is newer than FILE2
fi

Retirado do ' teste do homem '. Excerto:

FILE1 -nt FILE2
  FILE1 is newer (modification date) than FILE2
Eddie Parker
fonte
7

Outra maneira de fazer isso:

find -name file2 -newer file1

retornará nulo se o arquivo2 for mais antigo ou a mesma idade do arquivo1. Ele retornará o nome (e diretório) do arquivo2, se for mais recente.

Esteja ciente de que o Linux não acompanha quando os arquivos foram criados. Esses testes serão para a data e hora da modificação mais recente.

Dennis Williamson
fonte
2
O Linux acompanha o tempo de criação: é chamado ctime. Ele também controla o último horário de acesso: atime. Ele geralmente usa mtime geralmente, pois esse é o horário da última modificação, o que é mais útil.
Coroos
2
@Coroos: ctimenão é hora da criação. É a hora da mudança do inode e é atualizada quando os atributos do arquivo, como proprietário ou permissões, são alterados ou quando você modifica o arquivo. Alguns sistemas de arquivos suportam a hora do nascimento, mas o kernel não. Stat mostra um tempo de nascimento vazio. Veja unix.stackexchange.com/a/91200 Observe que o OS X suporta a hora do nascimentostat -f %SB filename
Dennis Williamson
Consulte também htrp: //unix.stackexchange.com/a/50184 sobre como usar debugfspara ver o tempo de criação (nascimento) no Linux.
Dennis Williamson
2

Se você quiser informações mais detalhadas, use o statcomando

<tbielawa>@(fridge)[~/SuperUser] 03:15:10
$ touch firstFile
<tbielawa>@(fridge)[~/SuperUser] 03:15:24
$ touch secondFile
<tbielawa>@(fridge)[~/SuperUser] 03:15:45
$ stat firstFile 
  File: `firstFile'
  Size: 0           Blocks: 0          IO Block: 4096   regular empty file
Device: 805h/2053d  Inode: 151528      Links: 1
Access: (0644/-rw-r--r--)  Uid: (  500/tbielawa)   Gid: (  500/tbielawa)
Access: 2010-09-14 03:15:24.938721003 -0400
Modify: 2010-09-14 03:15:24.938721003 -0400
Change: 2010-09-14 03:15:24.938721003 -0400
<tbielawa>@(fridge)[~/SuperUser] 03:15:48
$ stat secondFile 
  File: `secondFile'
  Size: 0           Blocks: 0          IO Block: 4096   regular empty file
Device: 805h/2053d  Inode: 151529      Links: 1
Access: (0644/-rw-r--r--)  Uid: (  500/tbielawa)   Gid: (  500/tbielawa)
Access: 2010-09-14 03:15:45.074722792 -0400
Modify: 2010-09-14 03:15:45.074722792 -0400
Change: 2010-09-14 03:15:45.074722792 -0400
Tim Bielawa
fonte
2
echo $(($(date -r file1 +%s)-$(date -r file2 +%s)))
2208

Se o resultado for> 0, o primeiro arquivo é mais recente. (Mais recente em termos da última modificação - e não da hora da criação, que é armazenada no linux).

Usuário desconhecido
fonte
nt é geralmente melhor, mas isso ainda é um post útil ...
BuvinJ
0

De acordo com este link, o unix não armazena a data de criação. http://www.issociate.de/board/post/302628/How_to_check_file_creation_date.html

Mas armazena o último acesso.

para o último acesso

 ls -t  # displays in order of date. So the first one is the 

ls exibe cada arquivo em uma nova linha.

então ls -t exibe o arquivo mais recente na primeira linha etc.

  • Você pode se usar para escolher a primeira linha.
  • Você pode usar sed para escolher a primeira linha.

    ls -t php.exe php.ini | sed -n '1p' php.ini

poderia fazer -lt que você vai ver que se você não especificar quaisquer arquivos .. e que o diretório .. então dá total na primeira linha, assim que você escolher a segunda linha como$ls -lt | sed -n '2p'

Uma boa seria

ls -t | head -n 1

ou

ls -lt | head   

exibe as 10 primeiras linhas em ordem primeiro arquivo modificado primeiro e você pode ver qual é

barlop
fonte
-té hora da modificação; -ué tempo de acesso
Dennis Williamson
obrigado .. eu estava pensando sobre -u .. a distinção .. e sim como você sugere .. -t e -u ordenados pelo tempo .. como o homem tem. melhor do que dizer que ordena por data.
barlop
embora talvez não tão bom como dizendo ordenados por data / hora ;-)
barlop
0

Aqui está um pequeno script, eu fiz:

mtf0=`stat -c %Y file0`    
mtf1=`stat -c %Y file1`    
dt=$(( mtf1 - mtf0 ))    
[[ $dt -gt 0 ]] && echo "File F1 is newer than file F0 "
user744989
fonte
Você deve explicar com mais detalhes o que isso está fazendo com algumas referências para o comando, para que as pessoas que o usam potencialmente tenham a oportunidade de ler sobre ele ou ouvir sua quebra um pouco mais do que apenas provar os comandos e a sintaxe.
Pimp Juice IT