Alle bis auf 1000 zufällige Dateien in einem Verzeichnis löschen
Code:
find /path/to/dir -type f -print0 | sort -zR | tail -zn +1001 | xargs -0 rm
Erklärung:
- Alle Dateien in
/path/to/dirauflisten mitfind;print0:Verwenden Sie\0(Nullzeichen ) als Zeilentrennzeichen; damit Dateipfade, die Leerzeichen/Zeilenumbrüche enthalten, das Skript nicht beschädigen
- Mischen Sie die Dateiliste mit
sort;-z:Verwenden Sie\0(Nullzeichen) als Trennzeichen, statt\n(ein Zeilenumbruch)-R:zufällige Reihenfolge
- Entfernen Sie die ersten 1000 Zeilen aus der randomisierten Liste mit
tail;-z:Behandle die Liste als durch Null getrennt (wie beisort)-n +1001:Zeilen ab 1001 anzeigen (dh die ersten 1000 Zeilen weglassen)
xargs -0 rm- Entfernen Sie die verbleibenden Dateien;-0:wieder nullbegrenzt
Warum es besser ist als die Lösung von Quixotic*:
- Funktioniert mit Dateinamen, die Leerzeichen/Zeilenumbrüche enthalten.
- Versucht nicht, Verzeichnisse zu erstellen (die übrigens bereits existieren könnten)
- Verschiebt keine Dateien, berührt nicht einmal die 1000 "Glücksdateien", außer dass sie mit
findaufgelistet werden . - Vermeidet das Fehlen einer Datei im Falle der Ausgabe von
findendet nicht mit\n(newline) aus irgendeinem Grund.
* - Dank an Quixotic für | sort -R | head -1000 , gab mir einen Ausgangspunkt.