当前访客身份:游客 [ 登录 | 加入 OSCHINA ]

代码分享

当前位置:
代码分享 » Shell/批处理  » 配置/脚本/批处理
goodluck

正则表达式批量重命名

goodluck 发布于 2010年12月15日 14时, 0评/1590阅
分享到: 
收藏 +0
1
虽然ubuntu下有prenme工具可以实现此功能但fedora下似乎没有这个东西,于是自己基于sed写了个bash脚本实现了基于正则表达式(sed格式)的批量重命名,关键是支持反向引用!
标签: <无>

代码片段(2) [全屏查看所有代码]

1. [文件] 基于sed的正则表达式批量文件重命名脚本 ~ 2KB     下载(17)     跳至 [1] [2] [全屏预览]

#!/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
)

2. [代码][Shell/批处理]代码     跳至 [1] [2] [全屏预览]

#!/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


开源中国-程序员在线工具:Git代码托管 API文档大全(120+) JS在线编辑演示 二维码 更多»

开源从代码分享开始 分享代码