Ich möchte, dass ein Linux-Befehl Dateien findet, die in den letzten nSekunden geändert wurden .
Gibt es ein Shell-Skript oder ein anderes Tool, das ich über die Befehlszeilenschnittstelle oder die GUI ausführen kann?
Ich möchte, dass ein Linux-Befehl Dateien findet, die in den letzten nSekunden geändert wurden .
Gibt es ein Shell-Skript oder ein anderes Tool, das ich über die Befehlszeilenschnittstelle oder die GUI ausführen kann?
Antworten:
Verwenden Sie den Befehl find wie folgt:
find . -name "*.txt" -mtime -60s
So finden Sie alle *.txtDateien, die in den letzten 60 Sekunden geändert wurden.
-mtime. "60s" ist auch keine gültige Option in POSIX oder GNU. Das Argument für -mtimeist eine Zahl, die die Anzahl der 24-Stunden-Zeiträume angibt, vor denen eine Datei geändert wurde.
Die Lösung mit mtime Sekundenangabe funktioniert nicht auf meinen Linux-Systemen, die find --version== verwenden find (GNU findutils) 4.4.2.
Ich erhalte folgenden Fehler:
mycomputer:~/new$ find . -mtime -60s
find: missing argument to `-mtime'
mycomputer:~/new$ find . -mtime -60seconds
find: missing argument to `-mtime'
Ich kann jedoch -mmin(für geändert in den letzten m Minuten) verwenden und kann ein Dezimalargument aufnehmen; Im Folgenden werden z. B. Dateien aufgeführt, die in den letzten 30 Sekunden geändert wurden.
find . -mmin 0.5
Also zum Beispiel; Erstellen von Dateien, die zuletzt geändert wurden 1s, 6s, 11s, ... vor über 120 Sekunden, findet dieser Befehl:
mycomputer:~/new$ for i in $(seq 1 5 120); do touch -d "-$i seconds" last_modified_${i}_seconds_ago ; done
mycomputer:~/new$ find . -mmin 0.5
.
./last_modified_1_seconds_ago
./last_modified_26_seconds_ago
./last_modified_11_seconds_ago
./last_modified_16_seconds_ago
./last_modified_21_seconds_ago
./last_modified_6_seconds_ago
Wenn Sie es also wirklich in Sekunden brauchen, können Sie Folgendes tun:
localhost:~/new$ for i in $(seq 1 1 120); do touch -d "-$i seconds" last_modified_${i}_seconds_ago ; done
localhost:~/new$ N=18; find . -mmin $(echo "$N/60"|bc -l)
./last_modified_1_seconds_ago
./last_modified_9_seconds_ago
./last_modified_14_seconds_ago
./last_modified_4_seconds_ago
./last_modified_12_seconds_ago
./last_modified_13_seconds_ago
./last_modified_8_seconds_ago
./last_modified_3_seconds_ago
./last_modified_5_seconds_ago
./last_modified_11_seconds_ago
./last_modified_17_seconds_ago
./last_modified_16_seconds_ago
./last_modified_7_seconds_ago
./last_modified_15_seconds_ago
./last_modified_10_seconds_ago
./last_modified_6_seconds_ago
./last_modified_2_seconds_ago
Ähnlich wie es Glenn vorgeschlagen hat, ist es möglicherweise einfacher, Folgendes zu tun, wenn Sie alle Änderungen in der Zeit finden möchten, in der ein Installationsprozess ausgeführt wurde:
touch /tmp/checkpoint
<do installer stuff>
find / -newer /tmp/checkpoint
Dann müssen Sie keine Zeitberechnung durchführen. Sie finden nur Dinge, die nach der Checkpoint-Datei geändert wurden.
Der einfachste Weg dies zu tun ist:
find . -name "*.txt" -newermt '6 seconds ago'
Die -mtime -60sin einer Antwort erwähnte Option funktioniert bei vielen Versionen von nicht find, auch nicht im Jahr 2016. Für -newermtuns ist sie eine viel bessere Option. Es können viele verschiedene Datums- und Zeitformate analysiert werden.
Eine alternative Methode mminist die folgende:
find . -name "*.txt" -mmin -0.5
# Finds files modified within the last 0.5 minute, i.e. last 30 seconds
Diese Option funktioniert möglicherweise nicht bei allen findVersionen.
Wenn Sie ein Verzeichnis auf Änderungen an Dateien überwachen, möchten Sie wahrscheinlich inotify-tools anstelle einer unendlichen Polling-Schleife verwenden.
Wenn Ihre Version von findkeine Sekunden oder realen Werte akzeptiert, wie meine, verwenden Sie -mmin, aber geben Sie 0 an, und alle Dateien werden in weniger als einer Minute geändert:
$ touch test; find . -type f -mmin 0
./test
find: missing argument to `-mtime'. Ich kann jedoch das gewünschte Verhalten mit -mmin und einem Dezimalargument erhalten. Ich konnte in der Manpage keine Referenz für find finden, diesals Argument verwendet werden könnte.