在工作中,遇到一些大图,甚至是超大图,对于大于6M的jpg图片,不得不优化一下,大图片的数量非常多,存在于不同数字编号目录里。
这里,要解决几个问题,
一、查找大于6M的jpg图片 我想到了find命令
二、分批处理与终止条件 要处理的图片实在是太多了,命令一运行,不知道连续多少天才能完成
三、备份源图片 复制就行了
四、图片优化程序的选择 必须是命令行的。我找到了jpegoptim,非常不错
五、经过优化的图片还是大于6M怎么办?不再优化!因为再处理的话,图片会严重失真,不符合要求。
六、多台机器同时处理 (未解决,文件锁问题)
问题二和三是紧密相连的
先说终止条件,有两种方法去终止这个脚本
1、用户输入要处理的大图数量,如100个,当处理完100个时,自然终止
2、当前处理数量小于用户输入数时,按^+C来终止,并手动把最后处理的一个文件从备份目录剪切到源目录
分批处理问题:以用户输入数为上限( 为何是上限?待处理大图未必有用户输入的那么多)
下次运行脚本时,如果有备份,就不处理已经备份的图片。
至此,全部问题得到解决。
以下附上脚本
#!/bin/bash
# by Daniel Chow @speedup2010
# v2 2012年06月 2日 星期六 2:44:05
# v3 2012年06月 2日 21:41:57
# v4 不知道跑哪去了。
# v5 2012年06月 3日 星期日 14:08:05
# 一次处理 n个大图
#bak_path=/cygdrive/b
#disk_x=/cygdrive/a
bak_path=/cygdrive/d/kingston/disk_b
disk_x=/cygdrive/d/kingston/disk_a
help(){
echo -e "\033[31m\n\t大哥/大姐,不带这样玩的!!!\033[0m\n\t随便输入个正数吧"
exit 0
}
if [ $# -eq 1 -a $1 -gt 0 ];then {
echo -e "\n\t本次最多处理$1个文件"
echo -ne "\033[31m
\t欲终止,在显示\033[34mExif\033[31m时,按CTRL+C,\n
\t并把最后处理的一个文件从备份目录剪切到源目录\n\n"
echo -ne "\033[32m\t源目录:$disk_x\n
\t备份目录:$bak_path\n
\t源目录文件\t->\t备份文件\n"
echo -ne "\033[0m"
[ $PWD == $disk_x ] || cd $disk_x
count=1
for large_img in `find ????????? -iname "*.jpg" -size +6M -type f`;do {
while [ ! -f $bak_path/$large_img ];do {
chah=${large_img%%/*}
[ ! -d $bak_path/$chah ] && mkdir -v $bak_path/$chah
cp $large_img $bak_path/$chah -v && jpegoptim --max=60 $large_img && count=`expr $count + 1 `
[ $count -gt $1 ] && break 2
}
done
}
done;
total_m=`expr $count - 1` && echo -e "\n\t处理了$total_m个文件\n"
}
else
help
fi