Come verificare che file2 sia più recente di file1 in bash?


51

Come posso verificare l' file2ultima modifica dopo file1?

In questo esempio, è perlstato modificato più recentemente di stack. Esiste un comando bash o Linux che può confrontare questi file in base al tempo di modifica?

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

Risposte:


51

L'ho trovato qui

for f in /abcd/xyz* do
   [ "$f" -nt /abcd/test.txt ] && echo "file f$ found" done

14
Inoltre -otè "più vecchio di".
Dennis Williamson,

1
Penso di aver appena avuto un problema con questo. Per i file con lo stesso tempo di modifica in secondi, hanno la "stessa" età di questi test; entrambi -nt e -ot danno lo stesso risultato (falso). Nel mio caso d'uso ho un programma che legge l'output degli altri e devo assicurarmi che abbiano funzionato nell'ordine corretto. In questo caso sembra necessario confrontare i nanosecondi.
sjmc

38
if [[ FILE1 -nt FILE2 ]]; then
  echo FILE1 is newer than FILE2
fi

Tratto da " man test ". Estratto:

FILE1 -nt FILE2
  FILE1 is newer (modification date) than FILE2

7

Un altro modo per farlo:

find -name file2 -newer file1

restituirà null se file2 è più vecchio o della stessa età di file1. Restituirà il nome (e la directory) di file2 se è più recente.

Ricorda che Linux non tiene traccia di quando sono stati creati i file. Questi test riguarderanno la data e l'ora di modifica più recenti.


2
Linux tiene traccia del tempo di creazione: si chiama ctime. Tiene inoltre traccia dell'ultimo tempo di accesso: atime. Usa solo mtime in generale, poiché questa è l'ultima volta di modifica, che è molto utile.
Coroos,

2
@Coroos: ctimenon è il momento della creazione. È l'ora di modifica dell'inode e viene aggiornata quando gli attributi del file come proprietario o autorizzazioni o cambiati o quando si modifica il file. Alcuni file system supportano l'ora di nascita, ma il kernel no. Stat mostra un tempo di nascita vuoto. Vedi unix.stackexchange.com/a/91200 Nota che OS X supporta l'ora di nascitastat -f %SB filename
Dennis Williamson,

Vedi anche htrp: //unix.stackexchange.com/a/50184 su come usare debugfsper vedere l'ora di creazione (nascita) in Linux.
Dennis Williamson,

2

Se vuoi informazioni più dettagliate puoi usare il 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

2
echo $(($(date -r file1 +%s)-$(date -r file2 +%s)))
2208

Se il risultato è> 0, il primo file è più recente. (Più recente in termini di ultima modifica, non di creazione-tempo, che è memorizzato su Linux).


-nt è generalmente migliore, ma questo è ancora un post utile ...
BuvinJ,

0

Secondo questo link, unix non memorizza la data di creazione. http://www.issociate.de/board/post/302628/How_to_check_file_creation_date.html

Ma memorizza l'ultimo accesso.

per ultimo accesso

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

Visualizza ogni file su una nuova riga.

quindi ls -t visualizza l'ultimo file sulla prima riga ecc.

  • Puoi usare te stesso per scegliere la prima riga.
  • Puoi usare sed per scegliere la prima riga.

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

potresti fare -lt se vedrai che se non specifichi alcun file .. e fa la directory .. allora fornisce il totale sulla prima riga, quindi scegli la seconda riga come$ls -lt | sed -n '2p'

Uno buono sarebbe

ls -t | head -n 1

o

ls -lt | head   

visualizza le prime 10 righe nell'ordine in cui il primo file viene modificato per primo e puoi vedere quale è


-tè tempo di modifica; -uè il tempo di accesso
Dennis Williamson,

grazie .. mi stavo chiedendo di -u .. la distinzione .. e sì come suggerisci .. -t e -u ordinate dal tempo .. come ha l'uomo. meglio che dirlo per data.
barlop,

anche se forse non è buono come dire ordinato per data / ora ;-)
barlop

0

Ecco una piccola sceneggiatura che ho fatto:

mtf0=`stat -c %Y file0`    
mtf1=`stat -c %Y file1`    
dt=$(( mtf1 - mtf0 ))    
[[ $dt -gt 0 ]] && echo "File F1 is newer than file F0 "

Dovresti spiegare più dettagliatamente cosa sta facendo con alcuni riferimenti per il comando, in modo che le persone che lo usano potenzialmente abbiano l'opportunità di leggerlo o di ascoltare il tuo errore un po 'più che provare semplicemente i comandi e la sintassi.
Pimp Juice IT
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.