¿Hay un máximo para bash expansión de nombre de archivo (globbing) y si es así, ¿qué es?

11

¿Hay un máximo para bash expansión de nombre de archivo (globbing) y si es así, ¿qué es? Ver globbing en tldp.org.

Digamos que quiero ejecutar un comando contra un subconjunto de archivos:

grep -e bar foo*
rm -f bar*

¿Existe un límite para la cantidad de archivos a los que bash se expandirá y, de ser así, cuál es?

No estoy buscando formas alternativas de realizar esas operaciones (por ejemplo, mediante el uso find).

Thomas
fuente
2
Ver también: ¿Qué define el tamaño máximo para un argumento de comando único? En los sistemas Linux actuales, existen diferentes límites para el tamaño de un único argumento y para el tamaño total. Este último depende del límite de tamaño de la pila.
ilkkachu

Respuestas:

17

No hay límite (aparte de la memoria disponible) para la cantidad de archivos que puede expandir un bashglobo.

Sin embargo, cuando esos archivos se pasan como argumentos a un comando que se ejecuta (en oposición a una función o función integrada de shell), entonces puede encontrarse con un límite de la execve()llamada del sistema en algunos sistemas. En la mayoría de los sistemas, esa llamada del sistema tiene un límite en el tamaño acumulativo de los argumentos y el entorno que se le pasa, y en Linux también tiene un límite separado en el tamaño de los argumentos individuales.

Para más detalles, ver:

Para evitar ese límite, puede usar (suponiendo GNU xargso compatible):

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

Arriba, dado que printfestá integrado (en la bashmayoría de los shells tipo Bourne), no llegamos al execve()límite. Y xargsdividirá la lista de argumentos en tantas rminvocaciones como sea necesario para evitar la execve()limitación.

Con zsh:

autoload zargs
zargs foo* -- rm -f

Con ksh93:

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

Puede ver el límite para el tamaño total de los argumentos con:

getconf ARG_MAX

Generalmente, esto no está determinado por el shell, sino por el sistema operativo subyacente de acuerdo con esta respuesta .

DopeGhoti
fuente
2
Creo que es la longitud total, no el número?
ilkkachu
1
Por supuesto que tienes razón; He actualizado mi respuesta para reflejar esto. Debido a esto, el límite del número de argumentos será una función de la longitud de los argumentos.
DopeGhoti