Пакетное сжатие JPG & amp; переименовать (найти -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, но конверт, похоже, не работал таким образом.

3
задан 12 May 2014 в 22:08

5 ответов

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

Один файл:

mogrify -resize 50% Pic.jpg 

Все .jpg файлы:

mogrify -resize 50% *.jpg
0
ответ дан 12 May 2014 в 22:08

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

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, изменив параметр find, или вы также можете сохранить преобразованные файлы в другом месте.

0
ответ дан 12 May 2014 в 22:08

Используйте 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

0
ответ дан 12 May 2014 в 22:08

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

0
ответ дан 12 May 2014 в 22:08

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

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

#!/bin/bash
SAVEIFS=$IFS
IFS=$(echo -en "\n\b")
C=0;
DES="./";       # Destination directory

for img in `find . -maxdepth 1 -mindepth 1 -iname '*.jpg' -type f`
do
    (( ++C ));
    NF="${DES}Pic_lorez_${C}.jpg";      # New file name
    convert $img -resize 50% $NF;
done

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

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

Похожие вопросы: