1 votes

Terminal MacOS - utilisation de wget et bash- ERROR "Argument list is too long" (la liste des arguments est trop longue)

J'utilise wget y bash pour télécharger un certain nombre de fichiers séquentiels à partir d'une URL à l'aide de {1..####} mais j'obtiens l'erreur : Argument list is too long

  1. Quand je cours getconf ARG_MAX Il est écrit 262144 - A quoi cette limite fait-elle référence ?

  2. Quelle commande augmentera la limite d'arguments (ou puis-je la supprimer ou la mettre à l'infini ?)?

3voto

Gordon Davisson Points 30215
  1. ARG_MAX est la limite (en termes de mémoire utilisée) de la taille de la liste totale des arguments + les variables d'environnement transmises à un exécutable. Voir cette question précédente et cette explication plus détaillée .

  2. Vous pouvez utiliser xargs pour diviser une liste d'arguments en groupes suffisamment petits pour être traités, mais selon la forme des arguments (et s'ils contiennent divers caractères gênants comme des espaces, des échappements, des guillemets, etc), cela peut devenir compliqué. Un moyen généralement sûr de le faire est d'utiliser printf '%s\0' pour imprimer la liste d'arguments avec des zéros à la fin, puis xargs -0 pour consommer la liste :

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

    Notez que les arguments qui doivent être transmis à chaque invocation de l'utilitaire (comme le paramètre -O dans cet exemple) doit être incluse dans le xargs et non l'invocation printf liste d'arg. De plus, si des arguments doivent être passés après la grande liste, vous avez besoin d'une invocation plus complexe de xargs .

    De plus, il peut sembler que cela ne devrait pas fonctionner parce que la grande liste d'arguments est toujours transmise à printf mais il s'agit d'une construction de l'interpréteur de commandes, et non d'un exécutable séparé, donc elle est gérée à l'intérieur de bash lui-même et la limite ne s'applique pas.

[BTW, je pensais qu'il y avait déjà eu des questions-réponses sur ce sujet, mais je n'en ai pas trouvé. Si quelqu'un d'autre en trouve une bonne, veuillez marquer cette question comme un doublon].

3voto

nohillside Points 82672

Lorsque vous exécutez

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

l'expansion de la {1..9999} est effectué par le shell, ce qui entraîne une liste d'arguments extrêmement longue (run echo foo{1..10} pour voir ce qui se passe).

Au lieu de cela, vous pouvez simplement exécuter

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

ou (en guise d'introduction)

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

pour que l'interpréteur de commandes gère la boucle directement et non dans les arguments passés à wget . La performance globale des téléchargements est de toute façon limitée par le réseau, de sorte que le forking et l'exécution de 10'000 wget (au lieu d'un seul) n'a pas d'impact notable.

PS : Remplacez 9999 par le nombre le plus élevé, ou utilisez quelque chose comme {1,7,9,15,22,36} pour des numéros spécifiques.

LesApples.com

LesApples est une communauté de Apple où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres utilisateurs d'appareils Apple, poser vos propres questions ou résoudre celles des autres.

Powered by:

X