GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Linux – Wie lösche ich Dateien, die zwischen zwei Mal erstellt wurden?

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:

  1. $(stat -c %Y "$1") — diese (zweite) Befehlsersetzung ruft stat auf auf $1 Parameter des eingebetteten Shell-Skripts; $1 wurde von find zugewiesen als einer der gefundenen Pfadnamen. Die Option %Y für stat Der Befehl gibt die Änderungszeit in Sekunden seit der Epoche zurück.
  2. date -d @ ... +%-H — Dies nimmt die Sekunden seit der Epoche aus der obigen Befehlsersetzung und fragt nach date um uns den Stundenanteil dieser Zeit zu geben; der @ Syntax sagt date 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.
Siehe auch:Debian Lenny:Willst du, dass Splashy direkt nach Grub2 startet?

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.


Linux
  1. So übertragen Sie Dateien zwischen zwei Computern mit den Befehlen nc und pv

  2. So löschen Sie RIESIGE (100-200 GB) Dateien in Linux

  3. So benennen Sie Dateien unter Linux um

  4. So löschen Sie Dateien und Verzeichnisse in Linux über die Befehlszeile

  5. So erstellen Sie Dateien einer bestimmten Größe unter Linux

So verwenden Sie den Datumsbefehl in Bash-Skripten unter Linux

So zeigen Sie zwei Dateien nebeneinander in Linux an

So vergleichen Sie zwei Dateien im Linux-Terminal

So synchronisieren Sie Dateien automatisch zwischen zwei Linux-Servern

So entfernen/löschen Sie Dateien in Linux mit dem Befehl rm

So zählen Sie Dateien im Verzeichnis unter Linux