Ich habe einen Ordner, in dem ich meine Datenbanken sichere, und ich möchte alle Sicherungen löschen, die zwischen 11:00 und 15:00 Uhr erstellt wurden, und es spielt keine Rolle, welcher Tag heute ist – das ist der Haken!
Ich fand diesen Befehl sehr hilfreich, aber nicht in meinem Anwendungsfall:
find . -type f -newermt '01 nov 2018 00:00:00' -not -newermt '10 nov 2018 00:00:00' -delete
Aber hier zwingt es mich zu einer Pause zwischen zwei Terminen! Ich möchte nur Backups löschen, die zwischen zwei bestimmten Zeiten erstellt wurden.
Akzeptierte Antwort:
Einfach genug, da Sie Linux markiert haben, haben Sie den stat
Befehl verfügbar, der die Änderungszeit einer Datei und das GNU date
extrahiert Befehl, der die Stunde aus einer bestimmten Zeit extrahiert:
find . -type f -exec sh -c '
h=$(date -d @$(stat -c %Y "$1") +%-H); [ "$h" -ge 11 ] && [ "$h" -lt 15 ]'
sh {} ; -ls
Wenn die Ergebnisse korrekt aussehen, dann:
find . -type f -exec sh -c '
h=$(date -d @$(stat -c %Y "$1") +%-H); [ "$h" -ge 11 ] && [ "$h" -lt 15 ]'
sh {} ; -delete
Hier ist ein Testlauf mit dem -ls
Version:
$ touch -d 'Wed Sep 12 11:00:01 EDT 2018' 11am
$ touch -d 'Wed Sep 12 12:00:02 EDT 2018' 12pm
$ touch -d 'Wed Sep 12 15:00:03 EDT 2018' 303pm
$ find . -type f -exec sh -c 'h=$(date -d @$(stat -c %Y "$1") +%-H); [ "$h" -ge 11 ] && [ "$h" -lt 15 ]' sh {} ; -ls
1705096 0 -rw-r--r-- 1 user group 0 Sep 12 2018 ./11am
1705097 0 -rw-r--r-- 1 user group 0 Sep 12 2018 ./12pm
Dank an Kusalananda für das Schreiben der ausgezeichneten Antwort, der ich gefolgt bin, unter:Understanding the -exec option of `find`
Beachten Sie, dass wir dies nicht tun wollen den {} +
Version von find
hier, wie wir wollen, die -exec
Ergebnisse pro Datei, sodass wir nur Dateien löschen, die dem Zeitbereich entsprechen.
Das eingebettete Shell-Skript besteht aus zwei Hauptteilen:Ermitteln Sie den Zeitstempel „Stunde“ der Datei und geben Sie dann basierend auf dem Bereich Erfolg oder Fehler zurück. Der erste Teil ist selbst in zwei Stücken ausgeführt. Der Variablen wird das Ergebnis der Befehlsersetzung zugewiesen; der Befehl sollte von innen nach außen gelesen werden:
$(stat -c %Y "$1")
— diese (zweite) Befehlsersetzung ruftstat
auf auf$1
Parameter des eingebetteten Shell-Skripts;$1
wurde vonfind
zugewiesen als einer der gefundenen Pfadnamen. Die Option %Y fürstat
Der Befehl gibt die Änderungszeit in Sekunden seit der Epoche zurück.date -d @ ... +%-H
— Dies nimmt die Sekunden seit der Epoche aus der obigen Befehlsersetzung und fragt nachdate
um uns den Stundenanteil dieser Zeit zu geben; der@
Syntax sagtdate
dass wir Sekunden seit der Epoche als Eingabeformat angeben. Mit dem-
Option im Datumsausgabeformat teilen wir GNU date nicht mit Füllen Sie den Wert mit führenden Nullen auf. Dies verhindert spätere oktale Fehlinterpretationen.
Sobald wir den $h
haben Stundenvariable zugewiesen, verwenden wir den Bedingungsoperator von Bash [[
um zu fragen, ob dieser Wert größer oder gleich 11 und auch streng kleiner als 15 ist.