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