优化jpg图片脚本
在工作中,遇到一些大图,甚至是超大图,对于大于6M的jpg图片,不得不优化一下,大图片的数量非常多,存在于不同数字编号目录里。
这里,要解决几个问题,
一、查找大于6M的jpg图片 我想到了find命令
二、分批处理与终止条件 要处理的图片实在是太多了,命令一运行,不知道连续多少天才能完成
三、备份源图片 复制就行了
四、图片优化程序的选择 必须是命令行的。我找到了jpegoptim,非常不错
五、经过优化的图片还是大于6M怎么办?不再优化!因为再处理的话,图片会严重失真,不符合要求。
六、多台机器同时处理 (未解决,文件锁问题)
问题二和三是紧密相连的
先说终止条件,有两种方法去终止这个脚本
1、用户输入要处理的大图数量,如100个,当处理完100个时,自然终止
2、当前处理数量小于用户输入数时,按^+C来终止,并手动把最后处理的一个文件从备份目录剪切到源目录
分批处理问题:以用户输入数为上限( 为何是上限?待处理大图未必有用户输入的那么多)
下次运行脚本时,如果有备份,就不处理已经备份的图片。
至此,全部问题得到解决。
以下附上脚本
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 | #!/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 |