Назад | Перейти на главную страницу

Выполнить команду для нескольких файлов

Мне нужно выполнить 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 {} \;

Или, если у вас несколько ядер, вы могли бы придумать больше и написать цикл, который сжимал несколько файлов параллельно