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?


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


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

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

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.