Laissez xargs faire le calcul pour vous.
printf '%s\0' files/* | xargs -0 mv -t new_files_dir
Votre question semble supposer qu'il existe une "limite réelle du nombre d'arguments", alors qu'en fait c'est une combinaison de deux limites :
-
la somme des longueurs de chaîne des arguments de ligne de commande et variables d'environnement, y compris leurs octets NUL de fin.
-
la longueur de chaîne maximale d'un seul argument de ligne de commande.
Par exemple, vous pourrez peut-être appeler une commande avec 200 000 arguments à une seule lettre, avec 100 000 arguments à deux lettres, mais pas avec un seul argument de plus de 128 k octets.
En supposant que le xargs
de GNU coreutils, xargs --show-limits </dev/null
montrera quelles sont ces limites sur votre système.
Sur n'importe quel système, xargs
ne sera pas utilisez les limites maximales de votre système lors de la construction de lignes de commande, mais choisirez quelque chose de raisonnable (cela n'aurait aucun sens de mettre le système à rude épreuve de cette façon).
Si c'est vraiment important, vous pouvez écrire votre propre batch-move
programme en C, qui prend par ex. la liste des fichiers comme entrée standard et effectue le déplacement à l'aide des appels système Unix appropriés.
Sinon, le "découvrez les limites et travaillez jusqu'à cela" est exactement quoi xargs(1)
(version GNU sur Linux, ici) le fait. Je doute fort que vous obteniez beaucoup plus vite.