%20und%20wenn%20ja%2C%20wie%20hoch%20ist%20es%3F.png)
Gibt es ein Maximum für die Bash-Dateinamenerweiterung (Globbing) und wenn ja, wie hoch ist es? SieheGlotzenauf tldp.org.
Nehmen wir an, ich möchte einen Befehl für eine Teilmenge von Dateien ausführen:
grep -e bar foo*
rm -f bar*
Gibt es eine Begrenzung für die Anzahl der Dateien, auf die Bash erweitert werden kann, und wenn ja, wie hoch ist diese?
Ich suche nicht nach alternativen Möglichkeiten, diese Vorgänge durchzuführen (z. B. durch Verwendung find
).
Antwort1
Es gibt keine Begrenzung (außer dem verfügbaren Speicher) für die Anzahl der Dateien, die durch einen bash
Glob erweitert werden können.
Wenn diese Dateien jedoch als Argumente an einen Befehl übergeben werden, derhingerichtet(im Gegensatz zu einem Shell-Builtin oder einer Shell-Funktion), dann stoßen Sie execve()
auf manchen Systemen möglicherweise auf eine Beschränkung des Systemaufrufs. Auf den meisten Systemen ist dieser Systemaufruf auf die Gesamtgröße der ihm übergebenen Argumente und Umgebungen beschränkt, und unter Linux gibt es auch eine separate Beschränkung auf die Größe einzelner Argumente.
Weitere Einzelheiten finden Sie unter:
- Was definiert die Maximalgröße für ein einzelnes Befehlsargument?
- CP: Maximale Anzahl an Quelldateien, Argumente für das Kopierprogramm
Um diese Beschränkung zu umgehen, können Sie Folgendes verwenden (GNU xargs
oder kompatibel vorausgesetzt):
printf '%s\0' foo* | xargs -r0 rm -f
Da oben printf
(in und den meisten Bourne-ähnlichen Shells) integriert ist bash
, stoßen wir nicht an die execve()
Grenze. Und xargs
wir werden die Liste der Argumente in so viele rm
Aufrufe aufteilen, wie nötig sind, um die execve()
Beschränkung zu umgehen.
Mit zsh
:
autoload zargs
zargs foo* -- rm -f
Mit ksh93
:
command -x rm -f foo*
Antwort2
Sie können die Grenze für die Gesamtgröße der Argumente erkennen an:
getconf ARG_MAX
Dies wird im Allgemeinen nicht von der Shell bestimmt, sondern vom zugrunde liegenden Betriebssystem gemäßdiese Antwort.