Lorsque j'exécute une commande comme ls */*/*/*/*.jpg
, j'obtiens l'erreur
-bash: /bin/ls: Argument list too long
Je sais pourquoi cela se produit: c'est parce qu'il y a une limite de noyau sur la quantité d'espace pour les arguments d'une commande. Le conseil standard est de changer la commande que j'utilise, pour éviter d'exiger autant d'espace pour les arguments (par exemple, utiliser find
et xargs
).
Que faire si je ne souhaite pas modifier la commande? Et si je veux continuer à utiliser la même commande? Comment puis-je faire en sorte que les choses "fonctionnent simplement", sans obtenir cette erreur? Quelles solutions sont disponibles?
Réponses:
Sous Linux, la quantité maximale d'espace pour les arguments de commande est de 1 / 4e de la quantité d'espace de pile disponible. Ainsi, une solution consiste à augmenter la quantité d'espace disponible pour la pile.
Version courte: exécutez quelque chose comme
Version plus longue: la quantité d'espace disponible par défaut pour la pile est d'environ 8192 Ko. Vous pouvez voir la quantité d'espace disponible, comme suit:
Choisissez un plus grand nombre et définissez la quantité d'espace disponible pour la pile. Par exemple, si vous souhaitez autoriser jusqu'à 65 536 Ko pour la pile, exécutez ceci:
Vous devrez peut-être jouer avec sa taille, en utilisant des essais et erreurs. Dans de nombreux cas, cela est une solution rapide et sale qui éliminera la nécessité de modifier la commande et le travail sur la syntaxe
find
,xargs
etc. (même si je me rends compte qu'il ya d' autres avantages à le faire).Je pense que c'est spécifique à Linux. Je soupçonne que cela n'aidera probablement aucun autre système d'exploitation Unix (non testé).
la source
Cet article du Linux Journal propose 4 solutions. Seule la quatrième solution n'implique pas de modifier la commande:
Je reconnais que la limitation est très gênante.
la source
Au lieu de
ls */*/*/*/*.jpg
, essayez:xargs
(1) sait quel est le nombre maximal d'arguments sur le système et décomposera son entrée standard pour appeler la ligne de commande spécifiée plusieurs fois sans plus d'arguments que cette limite, quelle qu'elle soit (vous pouvez également la définir inférieure à le maximum du système d'exploitation en utilisant l'-n
option).Par exemple, supposons que la limite est de 3 arguments et que vous disposez de cinq fichiers. Dans ce cas
xargs
, s'exécuterals
deux fois:ls 1.jpg 2.jpg 3.jpg
ls 4.jpg 5.jpg
Souvent, cela convient parfaitement, mais pas toujours - par exemple, vous ne pouvez pas compter sur
ls
(1) pour trier correctement toutes les entrées, car chaquels
invocation distincte ne triera que le sous-ensemble d'entrées qui lui est donné parxargs
.Bien que vous puissiez dépasser la limite comme suggéré par d'autres, il y aura toujours une limite - et un jour votre collection JPG la dépassera à nouveau. Vous devez préparer votre script (s) pour faire face à un nombre infini ...
la source
Argument list too long
, mais pourecho
au lieu dels
, sur les shells oùecho
n'est pas une commande intégrée au shell? (Peut-être que ce n'est pas un problème dans la plupart des obus, alors ce n'est peut-être pas pertinent.)find
avec le-print0
prédicat - et de canaliser sa sortiexargs
avec l'-0
option.echo
est un shell intégré et ne souffre pas de la limitation en ligne de commande deexec
(3).