2010-11-15 9 views
23

J'ai récemment copié et déplacé un grand nombre de fichiers (~ 400 000). Je sais qu'il y a des limitations sur le nombre d'arguments qui peuvent être développés sur la ligne de commande Bash, donc j'ai utilisé xargs pour limiter les nombres produits.Nombre maximal d'arguments Bash! = Nombre max arguments cp?

Par curiosité, je me suis demandé ce que le nombre maximum d'arguments que je pouvais utiliser était, et j'ai trouvé this post en disant qu'il était dépendant du système, et que je pouvais exécuter cette commande pour savoir:

$ getconf ARG_MAX 

à ma grande surprise, le anwser je suis retourné était:

2621440 

Un peu plus de 2,6 millions . Comme je l'ai dit, le nombre de fichiers que je manipule est bien inférieur à celui-ci - environ 400k. Je dois absolument utiliser la méthode xargs pour déplacer et copier ces fichiers, car j'ai essayé d'utiliser un mv * ... normal ou un cp * ... et une erreur "Liste d'arguments trop longue". Les commandes mv et cp ont donc leur propre limite fixe sur le nombre d'arguments que je peux utiliser (je n'ai rien trouvé dans leurs pages man), ou est-ce que quelque chose me manque?

+0

Pourquoi devez-vous spécifier chaque fichier? Tu ne peux pas juste spécifier le répertoire dans lequel ils sont ou quelque chose comme ça? –

+0

@Christoffer Je ne copie pas simplement un répertoire d'un endroit à un autre, je copie des fichiers spécifiques, je renomme des paquets de fichiers, je déplace certains fichiers d'un endroit à un autre. Je n'ai aucun problème à effectuer ces opérations. J'étais juste curieux de savoir quelles étaient les limitations spécifiques des commandes 'cp' et' mv'. –

Répondre

23

Comme dit Ignacio, ARG_MAX est la longueur maximale de la mémoire tampon d'arguments passés à exec(), et non le nombre maximal de fichiers (this page a une explication très approfondie). Plus précisément, il énumère fs/exec.c comme la vérification de la condition suivante:

PAGE_SIZE*MAX_ARG_PAGES-sizeof(void *)/sizeof(void *) 

Et, il semble, vous avez quelques limitations supplémentaires:

Sur Linux 32 bits, c'est arg/4-1 (32767). Cela devient pertinent si la longueur moyenne des arguments est inférieure à 4. Depuis Linux 2.6.23, cette fonction teste si le nombre dépasse MAX_ARG_STRINGS dans <linux/binfmts.h> (2^32-1 = 4294967296-1). Et comme limite supplémentaire, un argument ne doit pas être plus long que MAX_ARG_STRLEN (131072).

6

ARG_MAX est la longueur maximale des arguments des fonctions exec(3). Un shell n'est pas obligé de supporter le passage de cette longueur d'arguments depuis sa ligne de commande.

+0

Mais bash n'applique pas _any_ limit, dit [this] (http://www.in-ulm.de/~mascheck/various/argmax/); il essaie juste le 'exec' et transmet une erreur de système d'exploitation si la liste d'arguments est trop longue. – alexis

Questions connexes