Nehmen wir an, ich habe ein Verzeichnis, ḟoo/
das viele Dateien in einer Art Verzeichnisstruktur enthält. Ich muss einige von ihnen behalten, aber nicht alle.
Gibt es eine Möglichkeit, alle zu löschen, außer (sagen wir) 500 neuesten?
quelle
Nehmen wir an, ich habe ein Verzeichnis, ḟoo/
das viele Dateien in einer Art Verzeichnisstruktur enthält. Ich muss einige von ihnen behalten, aber nicht alle.
Gibt es eine Möglichkeit, alle zu löschen, außer (sagen wir) 500 neuesten?
Ich mache diese Aufgabe regelmäßig und verwende Varianten der folgenden. Es handelt sich um eine Pipeline, die verschiedene einfache Tools kombiniert: Suchen Sie alle Dateien, stellen Sie die Änderungszeit für Dateien voran, sortieren Sie, entfernen Sie die Änderungszeit für Dateien, zeigen Sie alle Zeilen mit Ausnahme der 500 zuerst an und entfernen Sie sie:
find foo/ -type f | perl -wple 'printf "%12u ", (stat)[9]' | \
sort -r | cut -c14- | tail -n +501 | \
while read file; do rm -f -- "$file"; done
Ein paar Kommentare:
Wenn Sie "bash" verwenden, sollten Sie "read -r file" verwenden, nicht nur "read file".
Die Verwendung von "Perl" zum Entfernen der Dateien ist schneller (und behandelt auch "seltsame" Zeichen in den Dateinamen besser als die while-Schleife, es sei denn, Sie verwenden "read -r file"):
... | tail -n +501 | perl -wnle 'unlink() or warn "$_: unlink failed: $!\n"'
Einige Versionen von "tail" unterstützen die Option "-n" nicht, daher müssen Sie "tail +501" verwenden. Eine tragbare Möglichkeit, die 500 ersten Zeilen zu überspringen, ist
... | perl -wnle 'print if $. > 500' | ...
Es funktioniert nicht, wenn Ihre Dateinamen Zeilenumbrüche enthalten.
Es ist keine GNU-Suche erforderlich.
Wenn Sie das oben Genannte kombinieren, erhalten Sie:
find foo/ -type f | perl -wple 'printf "%12u ", (stat)[9]' | \
sort -r | cut -c14- | perl -wnle 'print if $. > 500' | \
perl -wnle 'unlink() or warn "$_: unlink failed: $!\n"'
rm -f
.So würde ich es in Python 3 machen, das auch für andere Betriebssysteme funktionieren sollte. Stellen Sie nach dem Testen sicher, dass Sie die Zeile auskommentieren, in der die Dateien tatsächlich entfernt werden.
quelle
Ich weiß nichts über die "500 neuesten", aber mit find können Sie Dinge löschen, die älter als X Minuten / Tage sind. Beispiel für Datei und älter als 2 Tage:
Testen Sie zuerst mit:
Beachten Sie die Backslashes und das Leerzeichen vor "\;". Weitere Informationen finden Sie auf der Manpage zum Suchen.
quelle
Wenn Sie Dateien x Tage / Stunden alt halten könnten, anstatt die neueste x-Nummer, könnten Sie dies einfach mit tun
tmpwatch --ctime 7d
quelle
Ich denke, die
-mtime
und-newer
Befehlsoptionenfind
sind nützlich für Sie. Sie könnenman find
für weitere Informationen sehen.quelle
Warum nicht diesen einfacheren Code verwenden:
quelle