jpg
Для конвертации всех изображений я использую следующий скрипт png
:
# absolute path to image folder
FOLDER="/home/*/public_html/"
# max width
WIDTH=1280
# max height
HEIGHT=720
#resize png or jpg to either height or width, keeps proportions using imagemagick
find ${FOLDER} -type f \( -iname \*.jpg -o -iname \*.png \) -exec convert \{} -verbose -resize $WIDTHx$HEIGHT\> \{} \;
но сегодня я был в шоке, когда я побежал
ls -l
и нашел все фотографии изменены, данные изменены, большие или нет
Oct 28 11:18 /home/photos/20210321/T161631305496ece25372fc18a9239da7911ac7c0dd056 (2).jpg
Поэтому я думаю об использовании if
условия для проверки пути изображения в первую очередь, а затем, если WIDTH больше 1280px, запустить convert
. В противном случае ничего не делать.
обновление 2
Я создал этот скрипт
#!/bin/bash
for i in /root/d/*.jpg; do
read -r w h <<< $(identify -format "%w %h" "$i")
if [ $w -gt 1280 ]; then
FOLDER="$i"
WIDTH=1280
HEIGHT=720
find ${FOLDER} -type f \( -iname \*.jpg -o -iname \*.png \) -exec convert \{} -verbose -resize $WIDTHx$HEIGHT\> \{} \;
fi
done
Так я find
лучше вижу for
.
for
не выполнялся поиск во всех папках и подпапках.
обновление 3
WIDTH=1280
HEIGHT=720
find /home/sen/tes/ -type f \( -iname \*.jpg -o -iname \*.png \) | while read img; do \
anytopnm "$img" | pamfile | \
perl -ane 'exit 1 if $F[3]>1280' || convert "$img" -verbose -resize "${WIDTH}x${HEIGHT}>" "$img"; \
done
это работает хорошо, но я получаю
jpegtopnm: WRITING PPM FILE
когда нет изображений> 1280
решение1
Основная проблема с вашей convert
командой заключается в том, что аргумент $WIDTHx$HEIGHT\>
пытается расширить переменную с именем $WIDTHx
. Поскольку эта переменная не существует, аргумент, используемый с , -resize
будет просто тем, что $HEIGHT\>
есть (что то же самое, что и использование "${HEIGHT}x$HEIGHT>"
). Вы исправляете это, используя -resize "${WIDTH}x$HEIGHT>"
. Это проблема в обеих ваших find
командах.
Чтобы уменьшить слишком большие изображения, вы можете использовать что-то вроде
#!/bin/sh
w=1280
h=720
find /home/*/public_html -type f \( -iname '*.jpg' -o -name '*.png' \) \
-exec convert -resize "${w}x${h}>" {} \;
Лично я бы просто восстановил изображения из последней резервной копии, поскольку подобное масштабирование изображений неизбежно приведет к резкому снижению их качества.
При тестировании запускайте меньшие наборы копий изображений, прежде чем запускать скрипты на всю коллекцию изображений. Также убедитесь, что резервные копии работают как положено.
решение2
Мне очень жаль, что я выразился неясно, я нашел и создал свой окончательный сценарий и надеюсь исправить название Q на более умное
Скрипт ищет файлы jpg
или png
и если находит, проверяет ширину, если находит больше 1280, преобразует
#!/bin/bash
find /home/sen/tes/ -type f \( -iname \*.jpg -o -iname \*.png \) | while read i; do \
read -r w h <<<$(identify -format "%w %h" "$i")
if [ $w ]; then
if [ $w -gt 1280 ]; then
FOLDER="$i"
WIDTH=1280
HEIGHT=720
find ${FOLDER} -type f \( -iname \*.jpg -o -iname \*.png \) -exec convert \{} -verbose -resize ${WIDTH}x${HEIGHT}\> \{} \;
fi
fi
done