Скрипт Bash найти все изображения и mogrify изображения
У нас есть изображения, импортированные в нашу систему ночью, и мне нужно убедиться, что все изображения имеют ширину не менее 1000 пикселей или высоту, и мне нужно исключить изображения, которые находятся в папке кэша.
Я не эксперт по Bash. Я собрал это из нескольких источников. Я использовал find, чтобы найти все изображения продуктов и исключить папку кеша здесь.
find /overnight/media/catalog/product/ \( -name cache -prune \) -o -name '*' -exec file {} \; | grep -o -P '^.+: \w+ image'
Мне нужно запустить mogrify для каждого найденного файла изображения.
mogrify -resize "1000x1000>"
Как мне это сделать? Если мой подход не самый лучший, пожалуйста, дайте мне знать, что будет лучше.
2 ответа
Предполагая, что ваша команда поиска работает так, как вы намерены, что-то вроде этого должно быть достаточно
#!/bin/bash
set -e
FILES=`find /overnight/media/catalog/product/ \( -name cache -prune \) -o -name '*' -exec file {} \; | grep -o -P '^.+: \w+ image'`
AMOUNT=`echo $FILES | wc -w`
if [ ! -z "$FILES" ];
then
mogrify -resize "1000x1000>" $FILES
fi
echo "Done! $AMOUNT files found and changed!"
......
Я взял то, что предложил Бенджамин И Сьерра, и придумал это. Он проверяет, имеет ли изображение нужный размер, прежде чем он начнет работать с файлом. Я уверен, что есть "лучший" способ, но это, кажется, работает.
#!/bin/bash
IFS=$'\n'
set -e
minimumWidth=1000
minimumHeight=1000
FILES=$(find /overnight/media/catalog/product/ \( -name cache -prune \) -o -name '*' -type f -exec file {} \; | awk -F: '{ if ($2 ~/[Ii]mage|EPS/) print $1}')
AMOUNT=`echo $FILES | wc -w`
COUNTER=0
if [ ! -z "$FILES" ];
then
for F in $FILES
do
imageWidth="$(identify -format "%w" "$F")"
imageHeight="$(identify -format "%h" "$F")"
if [ "$imageWidth" -ge "$minimumWidth" ] || [ "$imageHeight" -ge "$minimumHeight" ]; then
echo "Not Changed. " ''"$imageWidth"x"$imageHeight"'' "$F"
else
echo "Initial Size"
ls -lah "$F" | awk -F " " {'print $5'}
mogrify -resize ''"$minimumWidth"x"$minimumHeight<"'' "$F"
echo "Resized Size"
ls -lah "$F" | awk -F " " {'print $5'}
let COUNTER=COUNTER+1
NewimageWidth="$(identify -format "%w" "$F")"
NewimageHeight="$(identify -format "%h" "$F")"
echo "Mogrifyed. $NewimageWidth"x"$NewimageHeight"
fi
done
fi
echo "Done! $COUNTER of $AMOUNT files found and changed!"