2010-11-15 12 views
23

Hace poco estuve copiando y moviendo una gran cantidad de archivos (~ 400,000). Sé que hay limitaciones en la cantidad de argumentos que se pueden expandir en la línea de comandos de Bash, así que he estado usando xargs para limitar los números producidos.Número máximo de argumentos Bash! = Max argumentos num cp?

Por curiosidad, me preguntaba lo que el número máximo de argumentos que podría utilizar era, y me encontré this post diciendo que era dependiente del sistema, y ​​que podía ejecutar este comando para averiguar:

$ getconf ARG_MAX 

Para mi sorpresa, el anwser llegué fue:

2621440 

poco más de 2,6 millones de . Como dije, el número de archivos que estoy manipulando es mucho menor que esto, alrededor de 400k. Definitivamente necesito usar el método xargs para mover y copiar estos archivos, porque traté de usar un mv * ... normal o cp * ... y obtuve un error de 'Lista de argumentos demasiado larga'.

Entonces, ¿los comandos mv y cp tienen su propio límite fijo en el número de argumentos que puedo usar (no pude encontrar nada en sus páginas man), o me falta algo?

+0

¿Por qué tiene que especificar cada archivo? ¿No puedes especificar el directorio en el que están o algo así? –

+0

@Christoffer No estoy simplemente copiando un directorio de un lugar a otro, estoy copiando archivos específicos, cambiando el nombre de grupos de archivos, moviendo ciertos archivos de un lugar a otro. No tengo ningún problema en realizar estas operaciones. Solo tenía curiosidad sobre cuáles eran las limitaciones específicas de los comandos 'cp' y' mv'. –

Respuesta

23

Como dijo Ignacio, ARG_MAX es la longitud máxima de la tampón de argumentos pasados ​​a exec(), no el número máximo de archivos (this page tiene una explicación muy en profundidad). En concreto, se enumera fs/exec.c como la verificación de la condición siguiente:

PAGE_SIZE*MAX_ARG_PAGES-sizeof(void *)/sizeof(void *) 

Y, al parecer, tiene algunas limitaciones adicionales:

En un Linux de 32 bits, esto es argmax/4-1 (32767). Esto se vuelve relevante si la longitud promedio de los argumentos es menor que 4. Desde Linux 2.6.23, esta función prueba si el número excede MAX_ARG_STRINGS en <linux/binfmts.h> (2^32-1 = 4294967296-1). Y como límite adicional, un argumento no debe ser más largo que MAX_ARG_STRLEN (131072).

6

ARG_MAX es la longitud máxima de los argumentos para las funciones exec(3). No se requiere un shell para admitir pasar esta longitud de argumentos desde su línea de comando.

+0

Pero bash no impone ningún límite, dice [esto] (http://www.in-ulm.de/~mascheck/various/argmax/); simplemente prueba el 'exec' y pasa un error de SO si la lista de argumentos es demasiado larga. – alexis

Cuestiones relacionadas