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).

Das könnte dich auch interessieren …

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert

Bitte beachte die Hinweise zum Datenschutz