Bash脚本找到所有图像并mogrify图像

时间:2016-07-07 20:00:38

标签: bash find mogrify

我们在晚上将图像导入到我们的系统中,我需要确保所有图像的宽度或高度至少为1000px,我需要排除缓存文件夹中的图像。

我不是bash专家。我从几个来源拼凑了这个。 我用find来查找所有产品图片,并在此处排除缓存文件夹。

find /overnight/media/catalog/product/ \( -name cache -prune \) -o -name '*' -exec file {} \; | grep -o -P '^.+: \w+ image'

我需要在找到的每个图像文件上运行mogrify。

mogrify -resize "1000x1000>" 

我该怎么做?如果我的方法不是最好的,请告诉我什么是更好的方法。

2 个答案:

答案 0 :(得分:0)

假设您的find命令按预期工作,这样的事情就足够了

#!/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!"

...

答案 1 :(得分:0)

我接受了本杰明和塞拉提出的建议并提出了这个问题。 在文件运行mogrify之前,它会查看图像是否具有适当的大小。我确定有一个更好的"方式,但这似乎有效。

#!/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!"