Bash

用於收集圖像像素大小的 shell 腳本

  • April 26, 2015

我正在嘗試創建以總尺寸像素大小返回最大圖片的 shell 腳本?

例如:

我有很多超過 7000+ 的目錄,每個目錄都有圖像:

dir_1/
picture_1.png = 800x600
picture_2.png = 80x100
picture_3.png = 80x640
picture_4.png = 500x630

dir_2/
p_1.png = 800x600
p_2.jpeg = 800x1000
p_3.png = 180x1640
p_4.gif = 500x30

所以預期的結果是:

the largest one in dir_1 is: picture_1.png 
the largest one is dir_2 is: p_2.png 

所以我在想最好的方法是在收集數字後找出總尺寸..因此我嘗試使用可以收集數字的 sips 命令創建 bash 腳本

這裡的例子:

for f in *;
do
far=$( cd $f/OEBPS/image/ | ls * | egrep 'jpg|png|jpeg')

W=$( sips -g pixelWidth $far | cut -f 2 -d":" )
H=$( sips -g pixelHeight $far | cut -f 2 -d":" )

coll=$(expr $W + $H)
echo $f total is: $coll
cd -
done

但結果出錯。

有什麼想法或更好的方法嗎?

這是一種一步獲得高度和寬度的方法:

IFS=x read w h < <(identify "$file" | grep -oP '\d+x\d+(?=\+)')

identify是 ImageMagick 包的一部分。

你的 “$far” 肯定不是你想要的:

for dir in */OEBPS/image/; do
   for image in "$dir"/*.{jpg,png,jpeg}; do
       IFS=x read w h < <(identify "$image" | grep -oP '\d+x\d+(?=\+)')
       echo $((w*h)) "$image"
   done | sort -n | tail -1 | {
       read size file
       echo "largest in $dir is $file"
   }
done

實際上,identify可以採取幾個文件,所以更有效的技術:

for dir in */OEBPS/image/; do
   identify "$dir"/*.{jpg,png,jpeg} |
   awk '{split($(NF-6), a, /x/); split($0, b, /[[]/); print a[1]*a[2], b[1]}' |
   sort -n | tail -1 | {
       read size file
       echo "largest in $dir is $file"
   }
done

awk 命令有點複雜,因為我想處理可能包含空格的圖像名稱

引用自:https://unix.stackexchange.com/questions/198570