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ć?


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ż”.


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 ];

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" ]

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.