Linux: rm Argument list too long Lösung
In diesem Beitrag geht es um das Linux rm Argument list too long Problem, für das ich eine Lösung anbiete. Mit dem GNU Programm rm löscht man in der Shell Dateien und Ordner. Hin und wieder stößt man aber gerade auf Linux Servern an die grenzen des kleinen Open Source Hilfsprogramms. Es gibt recht einfache Lösung.
Linux: rm Argument list too long Lösung
Legt man automatisiert Dateien in einem Betriebssystem ab, dann führt das unweigerlich irgendwann zu einem Problem. Gemäß dem Gesetz von Murphy geht alles was schief gehen kann auch irgendwann schief. Legt man automatisiert Dateien ab, dann ist irgendwann die Platte voll, oder die maximale Anzahl an möglichen Dateien in einem Ordner erreicht. Selbst wenn die Formatierung des Dateisystems Billionen Dateien zulässt und viele Terabyte zur Verfügung stehen – limitierter Platz ist irgendwann voll.
Dateien löschen
Unter Linux oder generell Unix-artigen Betriebssystemen wird eine Datei mit dem rm Befehl gelöscht. Durch dessen vielfältige Parameter kann man auch ganze Ordner oder Listen von Dateien löschen.
rm -r Ordner
löscht beispielsweise einen Ordner und alle Dateien darin durch den Parameter -r wird das rekursiv gemacht.
rm -r .
löscht alle Dateien im aktuellen Verzeichnis. Durch Angabe von Dateinamen und Wildcards kann man auch bestimmt benannte Dateien automatisiert entfernen, zum Beispiel:
rm -r *.log
Dieses Kommando würde alle Dateien mit einer .log Endung löschen.
Problem
Ab einer sehr hohen Anzahl an zu löschenden Dateien kommt es zu folgender Fehlerausgabe:
-bash: /bin/rm: Argument list too long
Auf herkömmlichen Weg lässt sich der zum Fehler führende Ausdruck nicht mehr rekursiv ausführen. Die Argumentliste der zu löschenden Dateien übersteigt das Limit. Laut einer Recherche ist das Maximum vermutlich bei 128 KiloByte der Argumentliste, also extrem hoch.
The maximum length of the command line is set by the system and is sometimes 128KiB.
Lösung
Es gibt zahlreiche Ansätze um die große Anzahl an Dateien trotzdem zu löschen. Eine der effektivsten ist eine einfache for Schleife:
for i in * ; do rm $i ; done
Dieses Kommando löscht einfach alle Dateien (* als Wildcard) im aktuellen Verzeichnis.
Fazit
Das rm Argument list too long Problem lässt sich dank der Linux Shell recht einfach lösen. Die Einschränkungen die durch eine (zwar sehr großzügig) aber trotzdem begrenzter Zeilenlänge entstehen können durch einfache Shell Programmierlogik umgangen werden. Generell sollte man darauf achten, dass so ein Problem gar nicht entsteht. In meinem Fall entstand das Problem durch ein fehlerhaftes Session-Management und fehlender Cleaner Routinen, weshalb für jeden Request eine Datei mit der Session ID abgelegt wird. Der Ordner wird über einen längeren Zeitraum unbeobachtet zugemüllt.
Effektiver ist wohl `find … -delete`
Super, vielen Dank. Die Lösung mit der for-Schleife hat mir geholfen! 🙂
TOP! Vielen Dank für den Tipp. Konnte ich gut gebrauchen, da durch motion 2 Verzeichnisse über 200.000 Dateien beinhalteten und ein normales rm versagt hat (Argument list too long)
Falls der tmp Ordner auch Unterordner enthält, muss man noch leicht anpassen auf:
for i in * ; do rm -rf $i ; done
… und dann hoffen, dass die Unterordner nicht auch schon zu viele Files enthalten 😉