Linux-Befehl zum Suchen von Dateien, die in den letzten n Sekunden geändert wurden

19

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?

Peter Mortensen
quelle

Antworten:

14

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.

anubhava
quelle
17
Unter Linux Fund (Fa GNU findutils 4.4.2), habe ich einen Fehler mit diesem Befehl erhalten: 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, die sals Argument verwendet werden könnte.
Dr. Jimbob
4
-60s ist kein gültiges Argument für -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.
Dannysauer
13

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
Dr. Jimbob
quelle
8

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

dannysauer
quelle
6

Wenn Sie eine Version von find haben, die dies nicht unterstützt, -mtime -60sist dies die bessere Lösung

touch -d '-60 seconds' /tmp/newerthan
find . -name "*.txt" -newer /tmp/newerthan
Düfte
quelle
6

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.

shivams
quelle
2
Dies ist eindeutig die beste Lösung.
Rednoah
1

Wenn Sie ein Verzeichnis auf Änderungen an Dateien überwachen, möchten Sie wahrscheinlich inotify-tools anstelle einer unendlichen Polling-Schleife verwenden.

Glenn Jackman
quelle
1

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
Sojabohnenöl
quelle