在循环中重命名文件

时间:2012-05-02 11:22:58

标签: bash unix

我有一个文件列表:File_2011_1.txtFile_2011_2.txtFile_2011_3.txt ... File_2011_100.txt;我想以所有文件名更新2011年到2012年。

以下不起作用:

for FILES in `ls`; do NEWNAME=`echo ${FILES} | sed -e 's/*2011*/*2012*/'`; echo ${FILES} ${NEWNAME}; done;

但这样做:

for FILES in `ls`; do NEWNAME=`echo ${FILES} | sed -e 's/File_2011*/File_2012*/'`; echo ${FILES} ${NEWNAME}; done;

那么,为什么在我要更改的文件名部分之前的通配符不起作用?

1 个答案:

答案 0 :(得分:5)

因为sed不使用File willcard(就像在bash或DOS中那样),而是正则表达式(regular expressions)。

你可以只做sed -e 's/2011/2012/'(默认情况下's'命令sed匹配字符串的一部分)。通配符*将以正则表达式语言编写为.*

sed regexps的基本规则:

  • 插入符号(^)与该行的开头匹配。
  • 美元符号($)与该行的结尾匹配。
  • 星号(*)匹配前一个字符的零次或多次。
  • 点(.)匹配任何字符。
  • []用于匹配字符集,例如[a-c01]与单个字符匹配:abc01