在工作中,遇到一些大图,甚至是超大图,对于大于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