Bash
用於收集圖像像素大小的 shell 腳本
我正在嘗試創建以總尺寸像素大小返回最大圖片的 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 命令有點複雜,因為我想處理可能包含空格的圖像名稱