Gibt es ein Maximum für die Erweiterung des Dateinamens (Globbing) und wenn ja, was ist das?

11

Gibt es ein Maximum für die Erweiterung des Dateinamens (Globbing) und wenn ja, was ist das? Siehe Globbing auf tldp.org.

Angenommen, 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 wird, und wenn ja, um welche handelt es sich?

Ich suche nicht nach alternativen Möglichkeiten, um diese Operationen durchzuführen (z find. B. durch Verwendung ).

Thomas
quelle
2
Verwandte: CP: max Quelldateien Anzahl Argumente für
Kopierdienstprogramm
2
Siehe auch: Was definiert die maximale Größe für ein einzelnes Befehlsargument? Auf aktuellen Linux-Systemen gibt es unterschiedliche Grenzen für die Größe eines einzelnen Arguments und für die Gesamtgröße. Letzteres hängt von der Stapelgrößenbeschränkung ab.
Ilkkachu

Antworten:

17

Es gibt keine Begrenzung (außer dem verfügbaren Speicher) für die Anzahl der Dateien, die um einen bashGlob erweitert werden können .

Allerdings , wenn diese Dateien als Argumente für einen Befehl übergeben werden, der wird ausgeführt (im Gegensatz zu einer Shell - builtin oder Funktion im Gegensatz), dann können Sie in eine Grenze des Lauf execve()Systemaufrufes auf einigen Systemen. Auf den meisten Systemen ist für diesen Systemaufruf die kumulative Größe der an ihn übergebenen Argumente und die Umgebung begrenzt, und unter Linux ist die Größe einzelner Argumente separat begrenzt.

Weitere Einzelheiten finden Sie unter:

Um diese Grenze zu umgehen, können Sie Folgendes verwenden (vorausgesetzt, GNU xargsoder kompatibel):

printf '%s\0' foo* | xargs -r0 rm -f

Da oben printf(in bashund die meisten Bourne-ähnlichen Muscheln) eingebaut ist, stoßen wir nicht an die execve()Grenze. Und xargsteilt die Liste der Argumente in so viele rmAufrufe auf, wie erforderlich, um die execve()Einschränkung zu vermeiden .

Mit zsh:

autoload zargs
zargs foo* -- rm -f

Mit ksh93:

command -x rm -f foo*
Stéphane Chazelas
quelle
7

Sie können die Grenze für die Gesamtgröße der Argumente sehen mit:

getconf ARG_MAX

Dies wird im Allgemeinen nicht von der Shell bestimmt, sondern vom zugrunde liegenden Betriebssystem gemäß dieser Antwort .

DopeGhoti
quelle
2
Ich denke, es ist die Gesamtlänge, nicht die Anzahl?
Ilkkachu
1
Sie sind natürlich richtig; Ich habe meine Antwort aktualisiert, um dies widerzuspiegeln. Aus diesem Grund hängt die Begrenzung der Anzahl der Argumente von der Länge der Argumente ab.
DopeGhoti