Это мой первый пост, поэтому я надеюсь, что вы будете достаточно любезны простить меня, если я сделаю какие-то ошибки в форматировании или что-то еще. Это один вопрос, который у меня был в течение достаточно долгого времени, и, ища ответы, у меня возникает больше вопросов. Я пытался найти способ сжимать изображения в папке, используя 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, но конверт, похоже, не работал таким образом.
convert
пишет в другой файл изображения. Для перезаписи исходных файлов изображений используйте mogrify
.
Один файл:
mogrify -resize 50% Pic.jpg
Все .jpg
файлы:
mogrify -resize 50% *.jpg
Попробуйте это:
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, или вы также можете сохранить преобразованные файлы в другом месте.
Используйте 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
Вы можете использовать этот вкладыш: for img in $(ls *.jpg); do convert $img -resize 50% $img;done;
Этот скрипт сделает это за вас!
Сохраните его в файл и сделайте файл исполняемым с помощью: 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_
на любое имя, которое вы хотите дать преобразованным файлам.