3

У меня есть 300k+ JPG файлы в том же каталоге. Файлы похожи на:

/covers    
0788862281217.jpg
0788863155104.jpg
7888311516341.jpg
7888370920479.jpg
7888497074277.jpg

Мне нужно пакетное изменение размера, сохраняя измененные изображения в том же каталоге с префиксом th_ в имени файла, как

th_0788862281217.jpg
th_0788863155104.jpg
th_7888311516341.jpg
th_7888370920479.jpg
th_7888497074277.jpg

все внутри /covers

Следующее работает, но перезаписывает исходные файлы

$ find thumbs -type f -name "*.jpg" | xargs mogrify -resize 75x75

поэтому я должен скопировать все изображения в новый каталог (/ Cover / Thumbs), а затем запустить пакет, а затем переместить все файлы обратно в / Cover

1 ответ1

7

Из руководства:

Mogrify перезаписывает исходный файл изображения, тогда как convert(1) записывает в другой файл изображения.

Ты можешь сделать:

find ./covers -type f -name '*.jpg' -execdir convert {} -resize 75x75 th_{} \;

Это, вероятно, будет наиболее эффективным, если у вас есть большое количество файлов.

В общем, по разным причинам это довольно плохая идея, чтобы передать вывод find в xargs , если вы не используете следующий паттерн, который GNU и BSD поддерживают для find вариантов: find … -print0 | xargs -0 …


Если вы хотите использовать команды только для оболочки, вы можете зациклить файлы следующим образом:

for image in ./covers/*.jpg; do convert "$image" -resize 75x75 "$(dirname $image)/th_$(basename $image)"; done

Это самое простое (и самое безопасное), которое вы можете получить, не прибегая к внешним командам. Однако вам нужно будет разделить путь и имя файла и вставить префикс между ними. Если вы уже находитесь в той же папке, это намного проще:

for i in *.jpg; do convert "$i" -resize 75x75 "th_$i"; done

Универсальное и более короткое решение с Zsh:

for i (./covers/*.jpg) convert "$i" -resize 75x75 "${i:h}/th_${i:t}"    

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .