1 votos

Terminal MacOS - usando wget y bash- ERROR "La lista de argumentos es demasiado larga"

Estoy usando wget y bash para descargar una serie de archivos secuenciales desde una URL utilizando {1..####} pero estoy recibiendo el error: Argument list is too long

  1. Cuando corro getconf ARG_MAX dice 262144 - ¿a qué se refiere este límite?

  2. ¿Qué comando aumentará el límite de argumentos (o puedo eliminarlo o ponerlo en infinito?)

3voto

Nate Puntos 220
  1. ARG_MAX es el límite (en términos de memoria utilizada) del tamaño de la lista total de argumentos + las variables de entorno que se pasan a un ejecutable. Véase esta pregunta anterior y esta explicación más detallada .

  2. Puede utilizar xargs para dividir una lista de argumentos en grupos lo suficientemente pequeños como para ser procesados, pero dependiendo de la forma de los argumentos (y de si contienen varios caracteres problemáticos como espacios en blanco, escapes, comillas, etc.) esto puede ser complicado. Una forma generalmente segura de hacerlo es utilizar printf '%s\0' para imprimir la lista de argumentos con nulos que la terminan, entonces xargs -0 para consumir la lista:

     printf '%s\0' https://example.com/prefix{1..100}.html | xargs -0 curl -O

    Tenga en cuenta que cualquier argumento que deba pasarse a cada invocación de la utilidad (como el -O en este ejemplo) debe incluirse en el xargs y no la invocación printf lista de arg. Además, si hay argumentos que necesitan ser pasados después de la lista grande, se necesita una invocación más compleja de xargs .

    Además, puede parecer que esto no debería funcionar porque la enorme lista de argumentos se sigue pasando a printf pero se trata de un shell builtin, no de un ejecutable separado, por lo que se maneja dentro de bash mismo y el límite no se aplica.

[Por cierto, pensé que debía haber una pregunta y respuesta anterior sobre esto, pero no la encontré. Si alguien encuentra una buena, por favor marque esta pregunta como duplicada].

3voto

Cuando se ejecuta

wget 'https://example.com/prefix'{1..9999}'.html'

la expansión de la {1..9999} lo hace el intérprete de comandos, lo que resulta en una lista extremadamente larga de argumentos (ejecutar echo foo{1..10} para ver qué pasa).

En su lugar, puede ejecutar simplemente

for i in {1..9999}; do
    wget 'https://example.com/prefix'${i}'.html'
done

o (como una sola línea)

for i in {1..9999}; do wget 'https://example.com/prefix'${i}'.html'; done

para que el shell maneje el bucle directamente y no en los argumentos pasados a wget . De todos modos, el rendimiento global de las descargas está limitado por la red, por lo que bifurcar y ejecutar 10'000 wget procesos (en lugar de uno solo) no tiene un impacto notable.

PD: Sustituye 9999 por el número más alto, o utiliza algo como {1,7,9,15,22,36} para números específicos.

AppleAyuda.com

AppleAyuda es una comunidad de usuarios de los productos de Apple en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X