Jak porównać znaczniki czasu plików w bash?

16

Jak porównać znacznik czasu dwóch plików?

Próbowałem tego, ale to nie działa:

file1time=`stat -c %Y fil1.txt`
file2time=`stat -c %Y file2.txt`
if[$file1time -gt $file2time];
then
 doSomething
fi

Wydrukowałem oba znaczniki czasu, w kolejności i daje mi to

1273143480
1254144394
./script.sh: line 13: [1273143480: command not found

Zasadniczo, jeśli porównanie nie działa, tak myślę. Lub jeśli istnieje inny przyjemny sposób niż to, co robię, daj mi znać. Co muszę zmienić?

newcoderintown
źródło
1
Twój kod potrzebuje spacji w nawiasach kwadratowych.
Jonathan Leffler,
Mechanizm testowy jest bardzo złożony w porównaniu z wbudowanym mechanizmem porównywania znaczników czasu.
Jonathan Leffler,

Odpowiedzi:

26

Operatory do porównywania znaczników czasu to:

[ $file1 -nt $file2 ]
[ $file1 -ot $file2 ]

Mnemonik jest łatwy: „nowszy niż” i „starszy niż”.

Jonathan Leffler
źródło
5

Wynika to z niektórych brakujących spacji. [jest poleceniem, więc musi mieć wokół siebie spacje, a ]jest specjalnym parametrem, który informuje, gdzie kończy się jego linia poleceń . Twoja linia testowa powinna więc wyglądać następująco:

if [ $file1time -gt $file2time ];
Goedson
źródło
3
[jest poleceniem testowym - patrz sekcja „WYRAŻENIA WARUNKOWE” na bashstronie man. Istnieje również samodzielny plik wykonywalny /usr/bin/testi /usr/bin/[, ale jeśli używasz bash i nie używasz pełnej ścieżki, to używasz wbudowanej powłoki.
Doug Harris
@Doug Harris +1, aby uzyskać pełniejsze wyjaśnienie na ten temat.
goedson
1

ifto nie magia. Próbuje uruchomić przekazane mu polecenie i sprawdza, czy ma zerowy status wyjścia. Nie radzi sobie również dobrze z nieistniejącymi argumentami, dlatego powinieneś zacytować używane w nim zmienne.

if [ "$file1time" -gt "$file2time" ]
Ignacio Vazquez-Abrams
źródło
0
if ( [ $file1time -gt $file2time ] );
then
 doSomething
fi                                                                    
użytkownik328064
źródło