Angenommen, ich habe ungefähr 10.000 Dateien in einem Ordner. Ich habe stündlich crontab verwendet, um Dateien zu finden, die in den letzten 60 Minuten geändert wurden, und sie dann verarbeitet.
Rufen Sie find -mmin -60
um 01:00:00
Angenommen, die erste Datei wurde um 00:00:00 Uhr geändert und durch „find“ um 01:00:00 Uhr leicht gefunden.
Nehmen wir dann an, dass die 10.000ste Datei ebenfalls um 00:00:00 Uhr geändert wurde
, aber ist jetzt um 01:10 Uhr : 00 und „find“ arbeiten immer noch hart daran, die 10.000ste Datei zu erreichen.
Jetzt, 70 Minuten später, wird „find“ die 10.000ste zurückgeben Datei, die um 00:00:00 geändert wurde?
Antwort
In GNU find
die Referenzzeit, die zur Auswertung verwendet wird Dateien mit -mmin
usw. werden berechnet und gespeichert, wenn der Ausdruck analysiert wird , also tatsächlich, wenn find
wird gestartet.
Dies bedeutet, dass alle derartigen Zeitvergleiche für alle ausgewerteten Dateien dieselbe Zeitreferenz verwenden, zu der find
hat die Befehlszeile analysiert.
Antwort
Unter der Annahme, dass GNU gefunden wird, ist dies leicht zu testen:
% mkdir foo; cd foo; touch a b % find -mmin 1 . ./a ./b % find -mmin 1 -exec sleep 120 \; -print . # 2 minutes wait before this showed up ./a # another 2 minutes before this showed up ./b # and another 2 minutes for this one % find -mmin 1 %
Obwohl b
zuletzt mindestens 4 Minuten nach dem Ausführen von find
sleep 120
für a
stimmte immer noch überein.
Da -mmin
isn „t POSIX, dies hängt von der Implementierung ab, aber ich würde das oben gezeigte Verhalten erwarten.
Kommentare
- FW IW, das (FreeBSD-basierte?)
find
auf meinem Mac zeigt auch beide Dateien mitfind . -mmin 1 -exec sleep 120 \; -print
Antwort
Versuchen Sie den folgenden Befehl nacheinander in zwei Terminals
Terminal 1:
find /path -mmin -0.017 -printf "$(date) %Tc %p\n" | grep "/path/to/some/file"
Terminal 2:
touch -d " 0 seconds ago" /path/to/some/file
Wir können das Ergebnis als
Ich stelle der Startzeit des Befehls das Suchergebnis voran. Es zeigt, dass find
nach Dateien suchen kann, die nach der Startzeit des Befehls geändert wurden.