Існує максимальний ліміт, скільки може тривати список аргументів для системних команд - цей ліміт залежить від дистрибутива на основі значення, MAX_ARG_PAGES
коли ядро компілюється, і його неможливо змінити без перекомпіляції ядра.
Зважаючи на те, як обробка керується оболонкою оболонкою, це вплине на більшість системних команд, коли ви використовуєте той самий аргумент ("* .jpg"). Оскільки глобул обробляється спочатку оболонкою, а потім надсилається команді, команда:
cp -uf *.jpg /targetdir/
по суті те ж саме з оболонкою, як якщо б ви написали:
cp -uf 1.jpg 2.jpg ... n-1.jpg n.jpg /targetdir/
Якщо ви маєте справу з великою кількістю jpegs, це може стати некерованим дуже швидко. Залежно від вашого правила іменування та кількості файлів, які ви насправді повинні обробити, ви можете запустити команду cp одночасно в іншому підмножині каталогу:
cp -uf /sourcedir/[a-m]*.jpg /targetdir/
cp -uf /sourcedir/[n-z]*.jpg /targetdir/
Це може спрацювати, але те, наскільки ефективно це було б, базується на тому, наскільки добре ви можете розбити список файлів на зручні глобальні блоки.
Глобальний. Мені подобається це слово.
Деякі команди, такі як find та xargs , можуть обробляти великі списки файлів, не створюючи болісно розміщених списків аргументів.
find /sourcedir/ -name '*.jpg' -exec cp -uf {} /targetdir/ \;
Аргумент -exec буде запускати решту командного рядка один раз для кожного знайденого файлу пошуку , замінюючи {} кожним знайденим іменем файлу. Оскільки команда cp одночасно виконується лише в одному файлі, обмеження списку аргументів не є проблемою.
Це може бути повільним через необхідність обробляти кожен файл окремо. Використання xargs може забезпечити більш ефективне рішення:
find /sourcedir/ -name '*.jpg' -print0 | xargs -0 cp -uf -t /destdir/
xargs може взяти повний список файлів, наданий знахідкою , і розбити його на списки аргументів керованих розмірів та запустити cp у кожному з цих підсписок.
Звичайно, є також можливість просто перекомпілювати ваше ядро, встановити більшу величину для MAX_ARG_PAGES
. Але перекомпіляція ядра - це більша робота, ніж я готовий пояснити у цій відповіді.