发个自己写的重命名脚本--支持正则表达式

sh/bash/dash/ksh/zsh等Shell脚本
回复
头像
goodluck1982
帖子: 171
注册时间: 2007-07-05 2:48

发个自己写的重命名脚本--支持正则表达式

#1

帖子 goodluck1982 » 2008-10-17 17:40

本来系统中有不少重命名的程序, 不过都用起来不太顺手
有一个倒是挺好,支持正则表达式,可是却偏偏正则表达式的向前引用功能有问题
为此目的,特地写了一个脚本

只支持正则表达式(通过sed, 所以以sed的正则表达式为准)方式的重命名
当然, 支持向前引用了.

使用方法:

myrename 's/pattern1/pattern2/' files

把patter1替换为pattern2, 完全以sed的处理方式为准

例如:
shot.png
shot.png (7.38 KiB) 查看 1010 次
真正替换前会告诉你要做如何的替换,然后然你确认是否真的重命名.

http://goodluck1982.blog.sohu.com/93457042.html
#!/bin/bash -f
#重命名脚本,主要是实现正则表达式的向前引用
# [email protected]
# ---2008-09-21 18:50:39---: 对每个单引号都要处理 sed 's/../../g'

(
tmp=.__$(date +%s)__tmp
tmp2=.__$(date +%s)__tmp2
tmp3=.__$(date +%s)__tmp3
s="$1"
shift 1
if [ "${s:0:1}" != 's' ]; then
echo
echo "Usage: myrename 's/<PATTERN1>/<PATTERN2>/[<modifier>]' filelist"
echo " Regular expressions used here is the same as that in sed."
echo
exit
fi
ls -1d "$@" >$tmp #产生文件名列表,注意处理目录 -d
sed "$s" $tmp >$tmp2 #根据"$s"中指定的替换规则用sed进行替换
if [ $? -ne 0 ] ; then #替代序列格式不对时则退出脚本
echo
echo " The string for substitue 's/<PATTERN1>/<PATTERN2>/[<modifier>]' has error!"
echo
exit
fi
sed -i "s/'/'\\\''/g" $tmp #处理文件名中含有单引号的特殊情况,每一个单引号都要处理
sed -i "s/'/'\\\''/g" $tmp2 #处理文件名中含有单引号的特殊情况
sed -i "s/.*/'&'/" $tmp #给文件名两边加上单引号
sed -i "s/.*/'&'/" $tmp2 #给文件名两边加上单引号
p=$(diff $tmp $tmp2 | grep '^[0-9]\+\(,[0-9]\+\)\?c[0-9]\+\(,[0-9]\+\)\?' | sed 's/c.*/p;/' | xargs) #找出有变化的文件名
sed -n -i "$p" $tmp #去掉没有变化的文件名
sed -n -i "$p" $tmp2 #去掉没有变化的文件名
paste -d ' ' $tmp $tmp2 > $tmp3
sed -i 's/^/mv /' $tmp3 #产生重命名用的脚本
sed -i 's/\(.*\)/ ==> [31;1m&[0m/' $tmp2 #为了显示好看,给变化后的文件名加上红色
echo
echo "List for files to be renamed:"
echo
paste -d ' ' $tmp $tmp2
echo
echo "Do you want to rename, y/n ?"
read yn
if [ "$yn" == "y" ]; then
. ./$tmp3
echo
echo " Files are renamed successfully!"
echo
else
echo
echo " Nothing done!"
echo
fi
\rm -f $tmp $tmp2 $tmp3
)
附件
myrename.gz
(1.02 KiB) 已下载 72 次
回复