Wie kann ich Dateien verschieben oder löschen, die in einem bestimmten Zeitraum erstellt wurden?

290
Tim

Ich mache Zeitraffer-Filme, die mehrere Wochen umfassen, und möchte die in der Nacht aufgenommenen Bilder (dh zwischen 22:45 und 5:00 Uhr) loswerden. Wie kann ich das problemlos tun?

Ich habe folgende Teillösungen gefunden:

  • Die Verwendung von find -newerXYund speziell -newermtwäre möglich, aber ich muss auch alle Termine durchlaufen.
  • Verwenden stat, um die mtime abzufragen, aber ich weiß nicht, wie ich die Zeiten in bash einfach vergleichen kann.

Ich mache es jetzt manuell, aber ich bin sicher, dass es eine elegantere Lösung geben muss. Irgendwelche Ideen? Vielen Dank! :)

0

2 Antworten auf die Frage

1
Kamil Maciorowski

Diese semi-einzelne Zeile druckt die "nächtlichen" Dateien:

( \ llimit=$((60*5+0)); \ ulimit=$((60*22+45)); \ find -type f -exec bash -c '\ hm=`stat -c "%y" "$0" | cut -c 12-16`; \ t=$((60*10#`echo $hm | cut -c 1-2`+10#`echo $hm | cut -c 4-5`)); \ test \( $t -lt $1 \) -o \( $t -gt $2 \)' \ {} $llimit $ulimit \; \ -print \ ) 

Unterzeilen erklärt:

  1. Startet eine Subshell, um die Variablen lokal zu machen.
  2. Berechnet die Untergrenze in Minuten nach Mitternacht.
  3. Berechnet die Obergrenze.
  4. Für jede Datei wird eine separate bashausgeführt. Es wird die Arithmetik machen.
  5. Extrahiert mtime as HH:MM.
  6. Konvertiert HH:MMin einen Wert als Minuten nach Mitternacht.
  7. Vergleicht diesen Wert mit vorberechneten Grenzwerten.
  8. Dies sind Argumente für das Innere bash; innen, werden sie bezeichnet als $0, $1, $2.
  9. Gibt den Pfad aus, wenn der vorherige Test true zurückgibt.
  10. Beendet die Subshell.

Einige Anmerkungen:

  • -execkann beim findAufruf als Test dienen . Das ist kaum offensichtlich und doch sehr mächtig. In diesem Fall ist der Test wahr, wenn der letzte Teil der inneren bashBefehlszeile (dh test) den Wert true zurückgibt (dh der Beendigungsstatus ist 0).
  • Bash-Arithmetik ( $((…))) parst 01oder so als Oktalzahl 08und 09ist ungültige Oktalzahl. Deshalb müssen wir 10#sicherstellen, dass alle aus der statAusgabe extrahierten Zahlen als Dezimalzahlen interpretiert werden.
  • Ich habe benutzt -ltund -gtin test. Verwenden Sie -leund / oder -gewenn sie besser zu Ihnen passen.
  • Um Dateien zu entfernen, ersetzen Sie sie -printmit -delete(oder verwenden Sie sie zusammen:) -print -delete.
  • Um Dateien in ein einzelnes Verzeichnis zu verschieben, ersetzen Sie diese -printmit -print0und erstellen eine Pipe wie folgt:

    ( … find … -print0 ) | xargs -0r mv -t /target/directory/ 
1
xenoid

Mit stat(setzt alle Dateien im selben Verzeichnis voraus)

stat -c '%y %n' * | grep -E ' (22:4[5-9]|22:5|23:|0[0-4]:)' | cut -d ' ' -f 4 | xargs mv -t $dirForRemovedFiles 
  • Dies setzt voraus, dass die Ausgabe von stat nicht vom Gebietsschema abhängt (es scheint nicht so zu sein ...). Andernfalls muss das Gebietsschema auf "C" gesetzt werden.
  • Dies setzt voraus, dass sich alle Dateien im selben DST-Segment befinden.
  • Beachten Sie das Leerzeichen zwischen dem Anführungszeichen und der Klammer. Dies bewirkt, dass der Regex nur mit dem Beginn des Zeitstempels übereinstimmt.
  • Zur Sicherheit löscht der obige Befehl nichts, er verschiebt lediglich die Dateien in ein Verzeichnis, in dem Sie ein Dokument ausgeben, rm *sobald Sie behauptet haben, dass Sie nichts vermissen.
  • Wenn Sie paranoid sind grep -E '^. (22:4[5-9]|22:5|23:|0[0-4]:)', vermeiden Sie falsche Treffer.
Warnung: Es hat zwar für das OP funktioniert, aber es sollte beachtet werden, dass eine Datei mit übereinstimmender Zeichenfolge (z. B. `foo 23: bar ') in * Dateiname * dann unabhängig von ihrer Zeit verschoben wird. Ein anderes Problem: Eine übereinstimmende Datei, deren Dateiname eine neue Zeile enthält, wird nicht verschoben, denke ich. Kamil Maciorowski vor 7 Jahren 0
Die Anpassung des Regexes wurde dem Leser als Übung überlassen. Wenn Sie Dateien mit Zeilenumbrüchen im Namen haben, haben Sie ein sehr leidvolles System und viele andere Probleme, die gelöst werden müssen, bevor Sie sich darüber wundern :) xenoid vor 7 Jahren 0