Скрипт 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!"
Другие вопросы по тегам