Esiste un limite massimo alla durata di un elenco di argomenti per i comandi di sistema: questo limite è specifico della distro in base al valore di MAX_ARG_PAGES
quando viene compilato il kernel e non può essere modificato senza ricompilare il kernel.
A causa del modo in cui la shell viene gestita dal globbing, ciò influirà sulla maggior parte dei comandi di sistema quando si utilizza lo stesso argomento ("* .jpg"). Poiché il glob viene prima elaborato dalla shell e quindi inviato al comando, il comando:
cp -uf *.jpg /targetdir/
è essenzialmente lo stesso per la shell come se avessi scritto:
cp -uf 1.jpg 2.jpg ... n-1.jpg n.jpg /targetdir/
Se hai a che fare con molti jpeg, questo può diventare ingestibile molto rapidamente. A seconda della convenzione di denominazione e del numero di file che è effettivamente necessario elaborare, è possibile eseguire il comando cp su un sottoinsieme diverso della directory alla volta:
cp -uf /sourcedir/[a-m]*.jpg /targetdir/
cp -uf /sourcedir/[n-z]*.jpg /targetdir/
Questo potrebbe funzionare, ma esattamente quanto sarebbe efficace si basa sulla capacità di suddividere l'elenco dei file in comodi blocchi globbable.
Globbable. Mi piace quella parola
Alcuni comandi, come find e xargs , possono gestire elenchi di file di grandi dimensioni senza creare elenchi di argomenti di dimensioni ridotte.
find /sourcedir/ -name '*.jpg' -exec cp -uf {} /targetdir/ \;
L'argomento -exec eseguirà il resto della riga di comando una volta per ogni file trovato da find , sostituendo {} con ogni nome file trovato. Poiché il comando cp viene eseguito solo su un file alla volta, il limite dell'elenco argomenti non è un problema.
Questo potrebbe essere lento a causa della necessità di elaborare ciascun file singolarmente. L'uso di xargs potrebbe fornire una soluzione più efficiente:
find /sourcedir/ -name '*.jpg' -print0 | xargs -0 cp -uf -t /destdir/
xargs può prendere l'elenco completo dei file fornito da find e suddividerlo in elenchi di argomenti di dimensioni gestibili ed eseguire cp su ciascuna di queste liste secondarie.
Naturalmente, c'è anche la possibilità di ricompilare il kernel, impostando un valore più grande per MAX_ARG_PAGES
. Ma ricompilare un kernel è più lavoro di quello che sono disposto a spiegare in questa risposta.