批量按规则重命名
发表于 : 2009-03-28 0:22
目录下有test_aa, test_ab,test_ac,test_ad, test_ba ,test_bb……test_ff ,等一系列文件,要求把后缀的a-f 改成0-5的数字表示,即为test_00,test_13 的形式,求教 各位如何用shell 命令(或者Shell script)实现?
命令越简洁越好!sed或tr 均可接受。
命令越简洁越好!sed或tr 均可接受。

代码: 全选
for i in ./* ; do mv -i "$i" `echo "$i" | tr 'abcdef' '012345'`;done
谢谢LS的回复。hellojinjie 写了:看到好几个都是要求重命名的
瞎写的,仅供参考,没有考虑有子目录的情况,记得给 mv 加 i 指令啊代码: 全选
for i in ./* ; do mv -i "$i" `echo "$i" | tr 'abcdef' '012345'`;done
代码: 全选
#!/bin/sh
for i in `find . -type f`
do
perfix=`echo $i | sed -r "s/(.*_)[a-f][a-f]$/\1/g"`
subfix=`echo $i | sed -r "s/.*_([a-f][a-f])$/\1/g"`
new_subfix=`echo $subfix | tr 'abcdef' '012345'`
newname=${perfix}${new_subfix}
# 判断文件是否已经存在,如果不存在就直接mv,存在就加 -i,提示是否覆盖
if [ -f "$newname" ]; then
mv -i $i $newname
else
mv $i $newname
fi
done
代码: 全选
jj@hellojinjie:/tmp$ echo asdfg | sed -n "/456/p"
jj@hellojinjie:/tmp$ echo $?
0
代码: 全选
i=0;
for f in test_[a-z][a-z]; do
mv "$f" "$f{%??}`printf %02d $i`"
((i++))
done