Linux Ordner mit mehreren tausend oder Millionen Dateien löschen
Es ist generell (unter Linux) keine gute Idee mehrere tausend Dateien in einem Ordner zu speichern, geschweige denn 3,5 Millionen Dateien in einem einzigen Ordner.
Doch wenn man mit den Standard PHP Sessions arbeitet, das Framework pauschal immer eine Session startet und dann noch die Session Laufzeit auf 30 Tage gestellt wird, dann hat man ganz schnell den Salat. Oops!
Nun kommt man mit einem simplen rm * nicht weit, dann erhält man nämlich die scharmante Fehlermeldung
Die Argumentliste ist zu lang (Argument list too long)
Anders gesagt: Man kann mit rm keine so große Anzahl an Dateien löschen. Nun stellt sich also die Frage: Was tun, wenn sich Dateien mit rm nicht mehr löschen lassen? Wie kann man unter Linux viele Dateien vor allem schnell löschen? Oder wie kann man viele, viele Dateien löschen, wenn diese alle in einem Ordner sind?
Nun gibt es einige Ansätze die Dateien doch noch gelöscht zu bekommen:
- Dateien per
findin Verbindung mit-execoder besser-deletelöschen - Per
rsyncmit einem leeren Verzeichnis syncen und ebenfalls Löschungen über--deleteberücksichtigen - Mit Perl und der
unlinkfunktion arbeiten
Eine schöne Zusammenfassung habe ich auf slashroot.in (englisch) gefunden, jedoch haben alle Varianten das System schnell extrem lahm gelegt. Daher habe ich die letzte Variante (Perl direkt auf der Konsole ausgeführt) ein wenig angepasst und hatte so nach ca. 24 Stunden endlich alle Dateien gelöscht.
Und so sieht die „Server bzw. Festplatten schonende Variante“ aus:
cd /path/with/a/lot/of/files/to/delete/
ionice -c 3 perl -e '$|=1; $i=0; for (<*>) {((stat)[9]<(unlink)); $i++; if ($i%500==0) {print "."; sleep 5;}}'Hier werden nur die Dateien eines Ordners gelöscht. Wenn der Ordner auch noch gelöscht werden soll, dann muss das natürlich separat mittels rmdir erfolgen.
Ob in meinem Fall erst ein stat wirklich die schnellste Variante ist, habe ich nicht weiter ausprobiert. Eventuell hätte man sich das stat auch noch sparen können (muss aber nicht so sein). So hat man natürlich noch die Möglichkeit bspw. nur Dateien zu löschen, die vor einem bestimmten Zeitpunkt das letzte Mal geändert wurden.
Wichtigste Anpassung: das sleep nach jeweils 500 gelöschten Dateien, da die Platte ansonsten nicht hinterher kommt und das System fast zum erliegen bringt (zumindest wenn das System auch sonst noch gut genutzt wird).
