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

42

Como posso verificar se file2 foi modificado pela última vez após file1 ?

Neste exemplo, perl foi modificado mais recentemente do que stack . Existe um comando bash ou Linux que pode comparar esses arquivos com base na hora da 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
    
por lidia 13.09.2010 / 21:21

7 respostas

43

Encontrado aqui

for f in /abcd/xyz* do
   [ "$f" -nt /abcd/test.txt ] && echo "file f$ found" done
    
por 13.09.2010 / 21:32
32
if [[ FILE1 -nt FILE2 ]]; then
  echo FILE1 is newer than FILE2
fi

Extraído de ' teste de homem '. Trecho:

FILE1 -nt FILE2
  FILE1 is newer (modification date) than FILE2
    
por 13.09.2010 / 22:03
7

Outra maneira de fazer isso:

find -name file2 -newer file1

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

Lembre-se de que o Linux não controla quando os arquivos foram criados. Estes testes serão para a data e hora de modificação mais recente.

    
por 13.09.2010 / 21:45
2
echo $(($(date -r file1 +%s)-$(date -r file2 +%s)))
2208

Se o resultado for > 0, o primeiro arquivo é mais novo. (Mais recente em termos de última modificação - não em tempo de criação, que é armazenado no linux).

    
por 13.01.2012 / 08:55
1

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

<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
    
por 14.09.2010 / 09:18
0

De acordo com este link, o unix não armazena a data de criação. link

Mas armazene 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.

so ls -t exibe o arquivo mais recente na primeira linha, etc.

  • Você pode usar você mesmo 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 , mas você verá que se você não especificar nenhum arquivo ... e ele faz o diretório ... então ele dá o total na primeira linha, então você escolhe a segunda linha como $ls -lt | sed -n '2p'

Um bom seria

ls -t | head -n 1

ou

ls -lt | head   

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

    
por 13.09.2010 / 21:51
0

Aqui está um pequeno roteiro, 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 "
    
por 03.07.2017 / 19:05

Tags