Argument list too long
Der ein oder andere Linuxuser kennt folgende Fehlermeldung vielleicht:
[sourcecode language="css"]Argument list too long.[/sourcecode]
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:
[sourcecode language="css"]grep ARG_MAX /usr/include/linux/limits.h
#define ARG_MAX 131072 /* # bytes of args + environ for exec() */[/sourcecode]
oder mit getconf ermitteln:
[sourcecode language="css"]getconf ARG_MAX[/sourcecode]
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:
[sourcecode language="css"]find . -name "*.foo" -exec rm {} ;[/sourcecode]
Eine andere Möglichkeit nutzt eine simple for-Schleife:
[sourcecode language="css"]for i in *.foo; do rm "$i"; done[/sourcecode]
Die effizienteste Methode (Dank für den Hinweis an Jan-Piet) arbeitet mit xargs:
[sourcecode language="css"]ls | xargs rm[/sourcecode]
Links:
ARG_MAX, maximum length of arguments for a new process



JP Mens
Die for Schleife ist teuer da sie ein Prozess pro rm-Aufruf erzeugen muss, bei find -exec genauso.
Effizient ist [code]bHMgfCB4YXJncyBybQ==[/code]; 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:
[code]bHMgKiB8eGFyZ3Mgcm0NCi1iYXNoOiAvYmluL2xzOiBEaWUgQXJndW1lbnRsaXN0ZSBpc3QgenUgbGFuZw==[/code]
Funktionierten tut:
[code]bHMgfCB4YXJncyBybQ==[/code]
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 [code]ZmluZCAuLi4uLi4gLXByaW50MCB8IHhhcmdzIC0wIC4uLg==[/code]; damit koennen auch Dateien mit spaces verarbeitet werden.
Im Uebrigen ist [code]bHMgKg==[/code] hauefig nicht, dass was der Kunde haben will
matthias
Upps, nicht [code]bHMgKg==[/code] war gemeint, sondern [code]IGxzICouZm9v[/code]
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…