Jun 3

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