反转命名以数字编号为基本文件名的文件

danny posted @ 2012年5月12日 05:05 in shell with tags shell hack , 2415 阅读

因为扫描图片要依页面来命名文件,扫描软件不支持逆序(或者叫做递减)命名的方式,所以必须要有一个操作,要么是把顺序乱的纸张排序过再扫描,要么先扫描再重新命名。如果让我来做,我选择后者,我不想给纸张重新排序

这个脚本做的事情是:1、修改文件拓展名大小写 2、反转文件名 ,如下:

$ ./rename_new.sh 100 105
第 100 页到第 105 页反转命名,共 6 页

100 --> 105
105 --> 100
101 --> 104
104 --> 101
102 --> 103
103 --> 102

#/bin/bash
unset origin
unset new
if [ $# == 2 -a $1 -lt $2 ];then {
begin=$1
end=$2
foot=`expr $end - $begin`
pages=`expr $foot + 1`
echo -e "第 $begin 页到第 $end 页反转命名,共 $pages 页\n"
# 定义旧文件序号
for i in `seq $begin $end`;do
        origin=(${origin[*]} $i);
#       echo ${origin[*]};
done

# 定义新文件序号
for j in `seq $begin $end |tac`;do
        new=(${new[*]} $j);
#       echo ${new[*]};
done
# 命名语句
for rename in `seq 0 $foot`;do
        if [ ${origin[$rename]} == ${new[$rename]} ];then
                echo -e "${origin[$rename]} = ${new[$rename]} 文件无需重命名"
        else
                echo ${origin[$rename]}' -->' ${new[$rename]}
        fi
done
}
else
echo -e "使用方法:\n
rename.sh 开始页码 结束页码\n
如 rename.sh 1 20 表示反转命名1到20页的文件\n
注意:开始页码要小于结束页码"
fi
#/bin/bash
# by Daniel Chow
unset small
unset big
ext=.jpg
begin=$1
end=$2
# 把所有大写转成小写
for small in `seq $begin $end`;do
        #echo $small;
        if [ -f $small.JPG ];then
        mv $small.JPG $small.jpg
        fi
done
# md5sum will be in next ver
if [ $# == 2 -a $1 -lt $2 -a -f $1.jpg -a -f $2.jpg ];then {
        sum=`expr $end + $begin`
        pages=`expr $end - $begin + 1`
        mid=`expr $sum / 2`
        echo -e "第 $begin 页到第 $end 页反转命名,共 $pages 页\n"

        for small in `seq $begin $end`;do
                big=`expr $sum - $small`
                #echo $big
                if [ $small -le $mid -a $small -ne $big ];then {
                        mv $big$ext var$ext
                        echo $small' -->' $big
                        mv $small$ext $big$ext
                        echo $big' -->' $small
                        mv var$ext $small$ext
                }
                else {
                        if [ $small == $big ];then
                        echo -e "$small is in the middle, no need to rename"
                        fi
                }
                fi
        done
#       md5sum *.jpg >big.txt
#       sed -i "s/ .*//g" small.txt big.txt
#       tac big.txt>mid.txt
#       cat mid.txt >big.txt
#       rm mid.txt -f
#       diff small.txt big.txt && echo "重命名成功"
}
else
        echo -e "使用方法:\n
        rename.sh 开始页码 结束页码\n
        如 rename.sh 1 20 表示反转命名1到20页的文件\n
        注意:开始页码要小于结束页码"
fi

第二版已经纠正第一版的错误,第一版不是有效的算法。使用了两个for 循环,一个是解决大小写问题(其实如果安装了rename,那变得更加简单,rename .JPG .jpg *.JPG),另一个的作用是重新命名,使用var.jpg作为中间过渡。


登录 *


loading captcha image...
(输入验证码)
or Ctrl+Enter