Cuando ejecuto un comando como ls */*/*/*/*.jpg
, me sale el error
-bash: /bin/ls: Argument list too long
Sé por qué sucede esto: es porque hay un límite de kernel en la cantidad de espacio para argumentos para un comando. El consejo estándar es cambiar el comando que uso, para evitar requerir tanto espacio para argumentos (por ejemplo, usar find
y xargs
).
¿Qué pasa si no quiero cambiar el comando? ¿Qué pasa si quiero seguir usando el mismo comando? ¿Cómo puedo hacer que las cosas "simplemente funcionen", sin obtener este error? ¿Qué soluciones hay disponibles?
Respuestas:
En Linux, la cantidad máxima de espacio para argumentos de comando es 1/4 de la cantidad de espacio de pila disponible. Entonces, una solución es aumentar la cantidad de espacio disponible para la pila.
Versión corta: ejecuta algo como
Versión más larga: la cantidad predeterminada de espacio disponible para la pila es algo así como 8192 KB. Puede ver la cantidad de espacio disponible, de la siguiente manera:
Elija un número mayor y establezca la cantidad de espacio disponible para la pila. Por ejemplo, si desea intentar permitir hasta 65536 KB para la pila, ejecute esto:
Es posible que deba jugar con lo grande que debe ser esto, utilizando prueba y error. En muchos casos, esta es una solución rápida y sucia, que eliminará la necesidad de modificar el comando y el trabajo fuera de la sintaxis
find
,xargs
etc. (aunque me doy cuenta de que hay otros beneficios para hacerlo).Creo que esto es específico de Linux. Sospecho que probablemente no ayudará en ningún otro sistema operativo Unix (no probado).
fuente
Este artículo de Linux Journal ofrece 4 soluciones. Solo la cuarta solución no implica cambiar el comando:
Estoy de acuerdo en que la limitación es muy molesta.
fuente
En lugar de
ls */*/*/*/*.jpg
, intente:xargs
(1) sabe cuál es el número máximo de argumentos en el sistema y dividirá su entrada estándar para llamar a la línea de comandos especificada varias veces sin más argumentos que ese límite, sea cual sea (también puede establecerlo por debajo de el máximo del sistema operativo usando la-n
opción).Por ejemplo, supongamos que el límite es de 3 argumentos y tiene cinco archivos. En ese caso
xargs
se ejecutaráls
dos veces:ls 1.jpg 2.jpg 3.jpg
ls 4.jpg 5.jpg
A menudo, esto es perfectamente adecuado, pero no siempre; por ejemplo, no puede confiar en
ls
(1) ordenar todas las entradas por usted correctamente, porque cadals
invocación por separado clasificará solo el subconjunto de entradas que se le asignanxargs
.Aunque puede superar el límite según lo sugerido por otros, todavía habrá un límite, y algún día su colección JPG lo superará nuevamente. Debes preparar tus guiones para lidiar con un número infinito ...
fuente
Argument list too long
, pero enecho
lugar dels
, en shells dondeecho
no hay un comando de shell incorporado? (Tal vez eso no sea un problema en la mayoría de los proyectiles, así que tal vez sea irrelevante).find
con el-print0
predicado, y canalizar su salidaxargs
con la-0
opción.echo
es un shell incorporado y no sufre la limitación de la línea de comandos deexec
(3).