Existe-t-il une extension maximale du nom de fichier bash (globbing) et si oui, quel est-il?

11

Existe-t-il une extension maximale du nom de fichier bash (globbing) et si oui, quel est-il? Voir globbing sur tldp.org.

Disons que je veux exécuter une commande sur un sous-ensemble de fichiers:

grep -e bar foo*
rm -f bar*

Y a-t-il une limite au nombre de fichiers que bash va développer, et si oui, quel est-il?

Je ne cherche pas d'autres moyens d'effectuer ces opérations (par exemple en utilisant find).

Thomas
la source
2
Voir aussi: Qu'est - ce qui définit la taille maximale d'un seul argument de commande? Sur les systèmes Linux actuels, il existe différentes limites pour la taille d'un seul argument et pour la taille totale. Ce dernier dépend de la limite de taille de pile.
ilkkachu

Réponses:

17

Il n'y a pas de limite (autre que la mémoire disponible) au nombre de fichiers qui peuvent être développés par un bashglob.

Cependant, lorsque ces fichiers sont passés en tant qu'arguments à une commande qui est exécutée (par opposition à une fonction ou une fonction intégrée au shell), vous pouvez alors rencontrer une limite de l' execve()appel système sur certains systèmes. Sur la plupart des systèmes, cet appel système a une limite sur la taille cumulée des arguments et de l'environnement qui lui sont transmis, et sur Linux également une limite distincte sur la taille d'un seul argument.

Pour plus de détails, voir:

Pour contourner cette limite, vous pouvez utiliser (en supposant GNU xargsou compatible):

printf '%s\0' foo* | xargs -r0 rm -f

Ci-dessus, comme il printfest intégré (dans bashet la plupart des obus Bourne), nous n'atteignons pas la execve()limite. Et xargsdivisera la liste d'arguments en autant d' rmappels que nécessaire pour éviter la execve()limitation.

Avec zsh:

autoload zargs
zargs foo* -- rm -f

Avec ksh93:

command -x rm -f foo*
Stéphane Chazelas
la source
7

Vous pouvez voir la limite de la taille totale des arguments avec:

getconf ARG_MAX

Ceci est généralement déterminé non pas par le shell, mais par le système d'exploitation sous-jacent selon cette réponse .

DopeGhoti
la source
2
Je pense que c'est la longueur totale, pas le nombre?
ilkkachu
1
Vous avez bien sûr raison; J'ai mis à jour ma réponse pour refléter cela. Pour cette raison, la limite du nombre d'arguments sera fonction de la longueur des arguments.
DopeGhoti