Il y a une limite maximale à la longueur d'une liste d'arguments pour les commandes système - cette limite est spécifique à la distribution en fonction de la valeur de MAX_ARG_PAGES
la compilation du noyau et ne peut pas être modifiée sans recompilation du noyau.
En raison de la façon dont le globbing est géré par le shell, cela affectera la plupart des commandes système lorsque vous utilisez le même argument ("* .jpg"). Étant donné que le glob est d'abord traité par le shell, puis envoyé à la commande, la commande:
cp -uf *.jpg /targetdir/
est essentiellement le même pour le shell que si vous écriviez:
cp -uf 1.jpg 2.jpg ... n-1.jpg n.jpg /targetdir/
Si vous traitez avec beaucoup de jpegs, cela peut devenir ingérable très rapidement. Selon votre convention de dénomination et le nombre de fichiers que vous devez réellement traiter, vous pouvez exécuter la commande cp sur un sous-ensemble différent du répertoire à la fois:
cp -uf /sourcedir/[a-m]*.jpg /targetdir/
cp -uf /sourcedir/[n-z]*.jpg /targetdir/
Cela pourrait fonctionner, mais exactement son efficacité est basée sur la façon dont vous pouvez diviser votre liste de fichiers en blocs globbables pratiques.
Globbable. J'aime ce mot.
Certaines commandes, telles que find et xargs , peuvent gérer de grandes listes de fichiers sans créer de listes d'arguments douloureusement dimensionnées.
find /sourcedir/ -name '*.jpg' -exec cp -uf {} /targetdir/ \;
L'argument -exec exécutera le reste de la ligne de commande une fois pour chaque fichier trouvé par find , en remplaçant le {} par chaque nom de fichier trouvé. Étant donné que la commande cp n'est exécutée que sur un fichier à la fois, la limite de la liste d'arguments n'est pas un problème.
Cela peut être lent car vous devez traiter chaque fichier individuellement. L'utilisation de xargs pourrait fournir une solution plus efficace:
find /sourcedir/ -name '*.jpg' -print0 | xargs -0 cp -uf -t /destdir/
xargs peut prendre la liste complète des fichiers fournie par find , la décomposer en listes d'arguments de tailles gérables et exécuter cp sur chacune de ces sous-listes.
Bien sûr, il est également possible de simplement recompiler votre noyau, en définissant une valeur plus élevée pour MAX_ARG_PAGES
. Mais recompiler un noyau est plus de travail que je ne veux l'expliquer dans cette réponse.