Skip to content

Viele, sehr viele Dateien in einem Verzeichnis unter Linux löschen

Ein bestimmter Server wurde in letzter Zeit immer unzuverlässiger und stürzte öfter mal ab, ohne dass wir eine genaue Ursache ausmachen konnten. Gestern habe ich mich dem Server noch mal angenommen und ein bisschen Ursachenforschung betrieben. Ein einfaches ls -la /var/log dauerte schon ewig. Ich spekulierte schon über einen Festplattenschaden bis ich dann irgendwann tatsächlich eine endlose Dateiliste zu sehen bekam.

Ein ls -la | wc -l brachte hervor, dass in diesem Ordner mehr als 1,3 Millionen Files lagen. Kein Wunder, dass  der Server dabei ab und an mal Schwierigkeiten hat. Die Ursache war, dass sich auf Debian/Ubuntu Systemen der sysklogd und logrotate gegenseitig in die Quere kommen. Aber dazu vielleicht ein anderes Mal mehr. Nun musste ich erst mal die ganzen überflüssigen Dateien löschen.

Das ist etwas leichter gesagt als getan, denn ein rm /var/log/mail.0.* brachte schon einen Fehler, dass die Liste der Dateien zu gross sei.

Lösung 1:

find /var/log -name "mail.0.*" -exec rm '{}' \;

find bearbeitet jede Datei einzeln, startet dann rm um die einzelne Datei zu löschen. Das funktionierte grundsätzlich, löschte allerdings nur ca. 150 Files pro Sekunde. Somit hätte der gesamte Vorgang 144 Stunden oder 6 ganze Tage gedauert. Ich brauchte eine andere Lösung.

Lösung 2:

find /var/log -name "mail.0.*" -delete -print

Damit übergibt find die Dateien nicht mehr an rm, sondern löscht sie gleich selbst. Damit erreichte ich ca. 2.000 Files pro Sekunde. Der gesamte Vorgang verkürzte sich somit auf ca. 10 Minuten. Das -print ist übrigens nur notwendig, wenn man sehen möchte, welche Dateien find löscht. Ohne Ausgabe dürfte es noch etwas schneller gehen. Na Also, geht doch. 

EDIT: Da der Artikel in einer früheren Version unfertig gespeichert wurde, habe ich die fehlenden Lösungen noch ergänzt ;-)

EDIT 2: "-name" ergänzt. Falscher Fehler in meiner Erinnerung. 

  • Twitter
  • Bookmark Viele, sehr viele Dateien in einem Verzeichnis unter Linux löschen at del.icio.us
  • Facebook
  • Google Bookmarks
  • Digg Viele, sehr viele Dateien in einem Verzeichnis unter Linux löschen
  • Bookmark Viele, sehr viele Dateien in einem Verzeichnis unter Linux löschen at YahooMyWeb
  • Bookmark Viele, sehr viele Dateien in einem Verzeichnis unter Linux löschen at Furl.net
  • wong it!
  • Identi.ca

Trackbacks

No Trackbacks

Comments

Display comments as Linear | Threaded

Jochen on :

Nimm find. Erst mal nur schauen ob die gefundenen Dateien dem gesuchten entsprechen:

find /var/log -name 'mail.0.*' -type f

Und dann weg damit;

find /var/log -name 'mail.0.*' -type f -exec rm -f {} \;

Marco Gabriel on :

Ja, das war meine erste Lösung. Gibt man find noch ein -delete an, braucht man rm nicht und es geht nochmals deutlich flotter. Ich hatte meinen Artikel gespeichert und erst später fertig geschrieben. Und leider nicht gemerkt, dass ich ihn auch schon veröffentlicht hatte ;-).

Jochen on :

Ah :-) "find -delete" war neu fuer mich, eine Alternative scheint (lt. man) auch "find -exec rm {} +" zu sein.

Wolf on :

ls /var log | grep 'mail.0.*' | xargs rm

täte es auch und würde eine eventuelle "too many arguments" Fehlermeldung vermeiden.

Marco on :

Leider nicht. xargs macht nicht, was man gemeinhin denkt: Es führt nicht den anschließenden Befehl mit jedem Argument einzeln aus, stattdessen baut es eine Argumentliste und hängt diese komplett an den Befehl an. Daher funktioniert diese Version bei sehr vielen Dateien nicht mehr.

DH on :

Vielen Dank!

Eine sehr wertvolle Hilfe (Lösung 2), die ich gerade jetzt brauchte!

Lars on :

Danke - hat mir sehr geholfen, weil die Lösung mit ner for Schleife lief schon die ganze Nacht und brauch ewig.
So ist das wenigstens in absehbarer Zeit lösbar.

Clas on :

War wirklich hilfreich und hat auch meinen Löschvorgang beschleunigt. Nur mit der Beispielrechnung komme ich nicht ganz zurecht.
Bei 10 Minuten mit einer Rate von 2000 1/s komme ich auf 1,2 Mio. Dateien. Bei 144 Stunden mit einer Rate von 150 1/s komme ich auf 77,8 Mio. Dateien. Eine Löschrate kann also nicht ganz stimmen, allerdings wenn die Anzahl der Dateien gleich war, dann hat diese Methode das Ganze noch viel stärker beschleunigt. :-)

Alex on :

Danke, damit konnte ich 1,6 Mio. (oder auch mehr) Dateien, die eine fleißige Außerkamera produziert hatte, löschen.
Qnap TS 219P+
Alex

Jörn Poppenhäger on :

Hi,

was auch geht ist, die Dinger in einer Schleife zu löschen

for i in * ; do rm $i ; done

Hat zumindest auf meinem Webserver problemlso mit 90500 Cache Dateien mit einer Größe von mehr als 4 GB funktioniert :-)

chris on :

Hallo

Danke erstmals für deine tips, jedoch hast nen kleinen Rechnungsfehler ;-)
Es handelt sich bei deinen berechneten 144h um 144Minuten, was einen kleinen aber doch wesentlichen Unterschied in der Zeitrechnung macht ;-) somit wärens noch etwas über 2h

gruss

Add Comment

Standard emoticons like :-) and ;-) are converted to images.
E-Mail addresses will not be displayed and will only be used for E-Mail notifications.
To leave a comment you must approve it via e-mail, which will be sent to your address after submission.
BBCode format allowed
You can use [geshi lang=lang_name [,ln={y|n}]][/geshi] tags to embed source code snippets.
Form options
tweetbackcheck cronjob