Argument list too long
Der ein oder andere Linuxuser kennt folgende Fehlermeldung vielleicht:
Argument list too long.
Ziemlich nervend wenn man beispielsweise viele Dateien in einem Durchgang löschen will. Die Limitierung gibt der Kernel vor, in dem ein festes Limit für die Argumente eines neues Prozesses definiert ist. Für Interessierte lässt sich das Limit in der Variable ARG_MAX in der Datei limits.h des Kernel Source-Codes finden:
grep ARG_MAX /usr/include/linux/limits.h #define ARG_MAX 131072 /* # bytes of args + environ for exec() */
oder mit getconf ermitteln:
getconf ARG_MAX
Um trotzdem seine Dateien löschen zu können oder andere Operationen auf viele Objekte anzuwenden, bieten sich u.a. folgende Möglichkeiten an. Zum einen lässt sich dies mit find realisieren:
find . -name "*.foo" -exec rm {} ;
Eine andere Möglichkeit nutzt eine simple for-Schleife:
for i in *.foo; do rm "$i"; done
Die effizienteste Methode (Dank für den Hinweis an Jan-Piet) arbeitet mit xargs:
ls | xargs rm
Links:
ARG_MAX, maximum length of arguments for a new process
Related posts:
- Linux Kernel backen – the Debian Way Braucht man unter Debian Etch (bzw. Ubuntu Linux) einen Treiber oder ein Feature, das im...
- Die beste Linux Live CD für den Sysadmin Linux Live CDs gibt es wie Sand am Meer. Dabei jedoch die richtige Live CD...
- Angriff auf das SMTP Protokoll Seit einigen Tagen schon macht man als Postmaster eine erschreckende Feststellung: SMTP Verbindungen am eigenen...
- Der Wahn im LAN: DHCP Fast jeder, der ein Büronetz zu betreuen hat, kennt DHCP. Im Folgenden werde ich einige...
- wget Alternative: schnellere Downloads mit axel Wer kennt das nicht – man braucht schnell eine ISO von Linux Distribution X oder...



JP Mens
Die for Schleife ist teuer da sie ein Prozess pro rm-Aufruf erzeugen muss, bei find -exec genauso.
Effizient ist
; xargs sorgt dafuer, dass rm mit nur so viel Parameter aufgerufen wird, dass ARG_MAX nicht ueberschritten wird.
matthias
Du hast recht Jan-Piet – vielen Dank für den Hinweis!
Mario
Ohne das ich gerade ein entsprechend unhandliches und überflüssiges Verzeichnis zur Hand hätte: “ls *.foo|xargs rm” dürfte es doch auch nicht tun weil das Sternchen wieder zur besagten zu großen Liste expandiert wird.
So könnte ich es mir vorstellen: “ls|egrep ‘.foo$’|xargs rm”
matthias
So, ich hab mir gerade mal ein großes Verzeichnis mit vielen vielen Dateien zum Testen gesucht. Ergebnis:
Funktionierten tut:
und auch die Lösung von Mario, wenn man nach bestimmten Mustern im Dateinamen sucht.
JP Mens
Ich schlage ein man find und man xargs vor, insbesondere ein
; damit koennen auch Dateien mit spaces verarbeitet werden.
Im Uebrigen ist
hauefig nicht, dass was der Kunde haben will
matthias
Upps, nicht
war gemeint, sondern
Der Adminblogger
Hat das einen Grund, warum die code-Blöcke base64(?) enthalten?
matthias
Gute Frage. Da muss es wohl Probleme beim letzten Wordpress Update oder dem Update eines Plugins gegeben haben. Ich werde der Sache mal auf den Grund gehen…