Мне нужно выполнить jpeg-повторное сжатие на тысячи файлов. Я пробовал:
for image in *.jpg; do
image2=${image%.*}.jpg;
./jpeg-recompress /path/to/images/$image /path/to/images/$image2;
echo "Processing $image2 file...";
done
Но не делает этого, утверждая, что: Maximum number of arguments exceeded
Я пробовал найти что-то вроде:
find /path/to/images -iname “*.jpg” | while read image; do
(и остальная часть предыдущего аргумента)
Но вроде ничего не делает. Мне было интересно, как я могу использовать эту программу для нескольких файлов?
jpeg-recompress image.jpg image.jpg
(Заменяет оригинал, как задумано)
Списки больших файлов
Есть много способов обойти это. Первое, что приходит на ум, - это использовать find.
for image in `find /path/to/jpegs -type f -name *.jpg`
do
something
done
Также есть xargs
команда, которая может оказаться полезной.
Продолжение использования цикла for может быть полезным; по сравнению с использованием только поиска, поскольку вы можете добавить файл журнала с файлами jpeg, которые вы обработали, чтобы вы могли пропустить их в следующий раз, когда вы запустите команду, если захотите.
Вы можете сделать что-нибудь простое, просто найдя:
find /path/to/images -name '*.jpg' -exec jpeg-recompress {} \;
Или, если у вас несколько ядер, вы могли бы придумать больше и написать цикл, который сжимал несколько файлов параллельно