鸿 网 互 联 www.68idc.cn

当前位置 : 服务器租用 > 服务器相关 > 批处理 > >

正则表达式批量重命名

来源:互联网 作者:佚名 时间:2016-03-03 12:14
虽然ubuntu下有prenme工具可以实现此功能但fedora下似乎没有这个东西,于是自己基于sed写了个bash脚本实现了基于正则表达式(sed格式)的批量重命名,关键是支持反向引用! 无 #!/bin/bash -f#重命名脚本,主要是实现正则表达式的向前引用# goodluck_1982@163
虽然ubuntu下有prenme工具可以实现此功能但fedora下似乎没有这个东西,于是自己基于sed写了个bash脚本实现了基于正则表达式(sed格式)的批量重命名,关键是支持反向引用! <无>
#!/bin/bash -f
#重命名脚本,主要是实现正则表达式的向前引用
# goodluck_1982@163.com
# ---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/\(.*\)/  ==>  &/' $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
)
#!/bin/bash -f
#重命名脚本,主要是实现正则表达式的向前引用
# goodluck_1982@163.com
# ---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/\(.*\)/  ==>  &/' $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
网友评论
<