Пакетное сжатие JPG и переименование (найти -exec, xargs, piping?)

Это мой первый пост, поэтому я надеюсь, что вы будете достаточно любезны простить меня, если я сделаю несколько ошибок форматирования или что-то еще. Это один вопрос, который у меня был в течение достаточно долгого времени, и, ища ответы, у меня возникает больше вопросов. Я пытался найти способ сжать изображения в папке с помощью convert в одной команде.

Сначала я просто попробовал:

convert * -resize 50% Pic.jpg

Однако это вернуло сжатые изображения с именами Pic-0.jpg, Pic-1.jpg и т. Д. (Я также пытался $(find ".JPG") вместо * но это распространяется на то же самое. Чтобы получить форматирование, которое я хотел, я попробовал:

convert * -resize 50% Pic_lorez_{1..3}.jpg

Но похоже, что Pic_lorez_2.jpg и Pic3_lorez_3.jpg в качестве входных файлов, а не выходных файлов. Следуя совету друга, я попробовал:

find . -name "*.JPG" -exec convert {} -resize 50% {} \;

Это сжимает все файлы с одним и тем же именем, но не позволяет добавить к этим файлам имя, которое я хочу (например, Pic_lorez_{1,2,3,4,5,..100}.jpg).

Сделает ли это возможным xargs? Что-то вроде:

find . -name "*.JPG" | xargs convert ???

Я не мог понять правильный синтаксис с xargs. Я, наконец, попробовал прямую трубу find в convert, но конверт, похоже, не работал таким образом.

5 ответов

convert пишет в другой файл изображения. Для перезаписи оригинальных файлов изображений используйте mogrify,

Отдельный файл:

mogrify -resize 50% Pic.jpg 

Все .jpg файлы:

mogrify -resize 50% *.jpg

Вы можете использовать этот лайнер:for img in $(ls *.jpg); do convert $img -resize 50% $img;done;

Этот скрипт сделает это за вас!

Сохраните его в файл и сделайте файл исполняемым с помощью: chmod +x filename,

#!/ Bin/ Баш
SAVEIFS=$IFS
IFS=$(echo -en "\n\b")
С =0;
DES="./";       # Каталог назначения

для IMG в `найти. -maxdepth 1 -mindepth 1 -имя '*.jpg' -типа f`
делать
    (( ++C));
    NF="${} DES Pic_lorez_${C}.jpg";      # Новое имя файла
    конвертировать $img -resize 50% $NF;
сделанный

# восстановить $IFS
IFS=$SAVEIFS
  • Изменить ./ в каталог, куда вы хотите поместить конвертированные изображения, по умолчанию он поместит их в текущий каталог.
  • + Изменить Pic_lorez_ на любое имя, которое вы хотите дать преобразованным файлам.

Используйте GNU Parallel:

find -iname "*.jpg" | parallel convert {} -resize 50% {.}_50pct.jpg

и получите дополнительный бонус за то, что все ваши ядра процессора будут работать параллельно, что ускорит процесс.

10 секунд установки:

wget pi.dk/3 -qO - | sh -x

Посмотрите вступительные видео, чтобы узнать больше: https://www.youtube.com/playlist?list=PL284C9FF2488BC6D1

Попробуй это:

SIZE=50 ; find -iname "*.jpg" | while read line ; do NF="$(echo $line | sed -r "s/(\.jpg|\.JPG)/_$SIZE\1/")" ; convert "$line" -resize $SIZE% "$NF" ; done

Это на самом деле не одна строка. Вот версия с отступом:

SIZE=50
find -iname "*.jpg" | while read line ; do
  NF="$(echo $line | sed -r "s/(\.jpg|\.JPG)/_$SIZE\1/")"
  convert "$line" -resize $SIZE% "$NF"
done

Вы можете настроить значение SIZE в любой другой размер, в процентах.

Обратите внимание, что после первого запуска он также примет уже преобразованные файлы в качестве входных файлов. Вы можете пропустить файлы с именем как _NUMBER.jpg изменив параметр поиска, или вы также можете сохранить преобразованные файлы в другом месте.

Другие вопросы по тегам