Tl;dr
C'est une limitation du noyau sur la taille de l'argument de la ligne de commande. Utilisez un for
à la place.
Origine du problème
Il s'agit d'un problème système, lié à execve
et ARG_MAX
constante. Il existe une documentation abondante à ce sujet (voir l'homme exécute , Le wiki de Debian ).
Fondamentalement, l'expansion produit un commande (avec ses paramètres) qui dépasse la ARG_MAX
limite. Sur le noyau 2.6.23
la limite a été fixée à 128 kB
. Cette constante a été augmentée et vous pouvez obtenir sa valeur en l'exécutant :
getconf ARG_MAX
# 2097152 # on 3.5.0-40-generic
Solution : Utiliser for
Boucle
Utilisez un for
comme il est recommandé sur BashFAQ/095 et il n'y a pas de limite, sauf pour la RAM/l'espace mémoire :
Faites un essai pour vous assurer qu'il supprimera ce que vous attendez :
for f in *.pdf; do echo rm "$f"; done
Et l'exécuter :
for f in *.pdf; do rm "$f"; done
Il s'agit également d'une approche portable car les glob ont un comportement fort et cohérent parmi les shells ( fait partie de la spécification POSIX ).
Note : Comme l'ont noté plusieurs commentaires, cette méthode est effectivement plus lente mais plus facile à maintenir car elle permet d'adapter des scénarios plus complexes, par exemple où l'on veut faire plus qu'une seule action.
Solution : Utiliser find
Si vous insistez, vous pouvez utiliser find
mais vraiment n'utilisez pas xargs comme il "est dangereux (cassé, exploitable, etc.) lors de la lecture d'une entrée non délimitée par NUL". :
find . -maxdepth 1 -name '*.pdf' -delete
Utilisation de -maxdepth 1 ... -delete
au lieu de -exec rm {} +
permet à find
pour simplement exécuter lui-même les appels système requis sans utiliser de processus externe, donc plus rapidement (grâce à la fonction Commentaire de @chepner ).
Références
29 votes
Vous pourriez trouver ceci lien utile
1 votes
Liés : Résolution du problème "mv : La liste des arguments est trop longue" ?
1 votes
Ceci peut également être pertinent http://mywiki.wooledge.org/BashFAQ/095
5 votes
@jww : Et j'ai continué à penser pendant tant d'années que bash relève des "outils logiciels couramment utilisés par les programmeurs" -- une catégorie dont les questions peuvent être posées ici !
0 votes
@Nik - Ajouter "... dans un script" n'est pas convaincant. Lorsque le problème est réduit à un Exemple minimal, complet et vérifiable c'est juste une question sur la façon d'exécuter une commande. Je vous prie de m'excuser si quelque chose d'évident m'échappe.
1 votes
@jww : pas "comment exécuter une commande"... mais "comment exécuter cette commande particulière sans obtenir l'erreur que j'obtenais"... non ?