Wenn ich einen Befehl wie ausführen ls */*/*/*/*.jpg
, wird der Fehler angezeigt
-bash: /bin/ls: Argument list too long
Ich weiß, warum dies passiert: Es liegt daran, dass der Platz für Argumente zu einem Befehl im Kernel begrenzt ist. Die Standardempfehlung lautet, den von mir verwendeten Befehl zu ändern, um zu vermeiden, dass so viel Platz für Argumente benötigt wird (z. B. find
und xargs
).
Was ist, wenn ich den Befehl nicht ändern möchte? Was ist, wenn ich weiterhin denselben Befehl verwenden möchte? Wie kann ich Dinge "einfach funktionieren" lassen, ohne diesen Fehler zu bekommen? Welche Lösungen gibt es?
Antworten:
Unter Linux beträgt der maximale Speicherplatz für Befehlsargumente 1/4 des verfügbaren Stapelspeichers. Eine Lösung besteht darin, den für den Stapel verfügbaren Platz zu vergrößern.
Kurzversion: Führen Sie so etwas wie
Längere Version: Der für den Stapel standardmäßig verfügbare Speicherplatz beträgt etwa 8192 KB. Sie können den verfügbaren Speicherplatz wie folgt anzeigen:
Wählen Sie eine größere Anzahl und legen Sie den verfügbaren Speicherplatz für den Stapel fest. Wenn Sie beispielsweise versuchen möchten, bis zu 65536 KB für den Stapel zuzulassen, führen Sie Folgendes aus:
Möglicherweise müssen Sie mit Trial-and-Error-Methoden herumspielen, wie groß diese sein müssen. In vielen Fällen ist dies eine schnelle und unsaubere Lösung , die die Notwendigkeit zu beseitigen , den Befehl und Arbeit aus der Syntax zu ändern
find
,xargs
usw. (obwohl ich weiß , es gibt noch andere Vorteile zu tun , so).Ich glaube, dass dies Linux-spezifisch ist. Ich vermute, es wird wahrscheinlich auf keinem anderen Unix-Betriebssystem (nicht getestet) helfen.
quelle
Dieser Artikel im Linux Journal enthält 4 Lösungen. Nur die vierte Lösung beinhaltet keine Änderung des Befehls:
Ich bin damit einverstanden, dass die Einschränkung sehr ärgerlich ist.
quelle
ls */*/*/*/*.jpg
Versuchen Sie stattdessen :xargs
(1) weiß, wie viele Argumente sich maximal im System befinden, und zerlegt die Standardeingabe, um die angegebene Befehlszeile mehrmals aufzurufen. Dabei darf diese Grenze nicht überschritten werden. Sie können sie auch niedriger als festlegen das Maximum des Betriebssystems unter Verwendung der-n
Option).Angenommen, das Limit liegt bei 3 Argumenten und Sie haben fünf Dateien. In diesem Fall
xargs
wirdls
zweimal ausgeführt:ls 1.jpg 2.jpg 3.jpg
ls 4.jpg 5.jpg
Oft ist dies perfekt geeignet, aber nicht immer - Sie können sich beispielsweise nicht darauf verlassen, dass
ls
(1) alle Einträge ordnungsgemäß für Sie sortiert werden, da bei jedem separatenls
Aufruf nur die Teilmenge der Einträge sortiert wird, nach denen sie sortiert wurdenxargs
.Obwohl Sie das von anderen vorgeschlagene Limit überschreiten können, wird es immer noch ein Limit geben - und eines Tages wird Ihre JPG-Sammlung wieder größer. Sie sollten Ihre Skripte darauf vorbereiten, mit einer unendlichen Zahl umzugehen ...
quelle
Argument list too long
, aber fürecho
stattls
, auf Schalen , woecho
nicht eine Shell ist eingebauter Befehl? (Vielleicht ist das in den meisten Shells kein Problem, also ist das vielleicht irrelevant.)find
das-print0
Prädikat und leiten die Ausgabexargs
mit der-0
Option ein.echo
ist eine eingebaute Shell und unterliegt nicht der Befehlszeilenbeschränkung vonexec
(3).