Wie werden Datei-Zeitstempel in Bash verglichen?

16

Wie vergleiche ich den Zeitstempel zweier Dateien?

Ich habe es versucht, aber es funktioniert nicht:

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

Ich habe beide Zeitstempel in der richtigen Reihenfolge gedruckt und es gibt mir

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

Also im Grunde, wenn der Vergleich nicht funktioniert, denke ich. Oder wenn es einen anderen netten Weg gibt als das, was ich tue, lass es mich wissen. Was muss ich ändern?

newcoderintown
quelle
1
Ihr Code benötigt Leerzeichen um die eckigen Klammern.
Jonathan Leffler
Der Testmechanismus ist im Vergleich zum eingebauten Mechanismus zum Vergleichen von Zeitstempeln sehr komplex.
Jonathan Leffler

Antworten:

26

Die Operatoren zum Vergleichen von Zeitstempeln sind:

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

Die Mnemonik ist einfach: "neuer als" und "älter als".

Jonathan Leffler
quelle
5

Dies liegt an einigen fehlenden Leerzeichen. [ist ein Befehl, daher muss er mit Leerzeichen versehen sein und der ]ist ein spezieller Parameter, der angibt, wo seine Befehlszeile endet. Ihre Testzeile sollte also so aussehen:

if [ $file1time -gt $file2time ];
goedson
quelle
3
[ist ein Testbefehl - siehe Abschnitt "CONDITIONAL EXPRESSIONS" auf der bashManpage. Es gibt auch eine eigenständige ausführbare Datei in /usr/bin/testund /usr/bin/[, aber wenn Sie Bash verwenden und nicht den vollständigen Pfad verwenden, verwenden Sie die integrierte Shell.
Doug Harris
@Doug Harris +1 für eine ausführlichere Erläuterung des Themas.
Goedson
1

ifist keine Magie. Es wird versucht, den übergebenen Befehl auszuführen, und es wird geprüft, ob der Beendigungsstatus Null ist. Nicht existierende Argumente werden ebenfalls nicht gut verarbeitet, weshalb Sie die darin verwendeten Variablen in Anführungszeichen setzen sollten.

if [ "$file1time" -gt "$file2time" ]
Ignacio Vazquez-Abrams
quelle
0
if ( [ $file1time -gt $file2time ] );
then
 doSomething
fi                                                                    
user328064
quelle