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
find
in Verbindung mit-exec
oder besser-delete
löschen - Per
rsync
mit einem leeren Verzeichnis syncen und ebenfalls Löschungen über--delete
berücksichtigen - Mit Perl und der
unlink
funktion 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).