Существует максимальный предел длины списка аргументов для системных команд - этот предел зависит от дистрибутива в зависимости от значения MAX_ARG_PAGES
времени компиляции ядра и не может быть изменен без перекомпиляции ядра.
Из-за того, как оболочка обрабатывает глобирование, это повлияет на большинство системных команд, когда вы используете один и тот же аргумент ("* .jpg"). Поскольку глоб обрабатывается сначала оболочкой, а затем отправляется команде, команда:
cp -uf *.jpg /targetdir/
по сути то же самое для оболочки, как если бы вы написали:
cp -uf 1.jpg 2.jpg ... n-1.jpg n.jpg /targetdir/
Если вы имеете дело с большим количеством JPEG, это может стать неуправляемым очень быстро. В зависимости от вашего соглашения об именах и количества файлов, которые вы фактически должны обработать, вы можете одновременно запускать команду cp в другом подмножестве каталога:
cp -uf /sourcedir/[a-m]*.jpg /targetdir/
cp -uf /sourcedir/[n-z]*.jpg /targetdir/
Это может сработать, но как именно это будет эффективно, зависит от того, насколько хорошо вы сможете разбить ваш список файлов на удобные блоки, которые можно сгладить.
Globbable. Мне нравится это слово.
Некоторые команды, такие как find и xargs , могут обрабатывать большие списки файлов, не создавая списков аргументов очень большого размера.
find /sourcedir/ -name '*.jpg' -exec cp -uf {} /targetdir/ \;
Аргумент -exec будет запускать оставшуюся часть командной строки один раз для каждого файла, найденного командой find , заменяя {} на каждое найденное имя файла. Поскольку команда cp выполняется только для одного файла за раз, ограничение списка аргументов не является проблемой.
Это может быть медленным из-за необходимости обрабатывать каждый файл отдельно. Использование xargs может обеспечить более эффективное решение:
find /sourcedir/ -name '*.jpg' -print0 | xargs -0 cp -uf -t /destdir/
xargs может взять полный список файлов, предоставленный командой find , и разбить его на списки аргументов управляемых размеров и запустить cp для каждого из этих подсписков.
Конечно, есть также возможность просто перекомпилировать ядро, установив большее значение для MAX_ARG_PAGES
. Но перекомпиляция ядра - это больше работы, чем я хочу объяснить в этом ответе.