在Unix中替换文件名中的字符串

时间:2014-01-07 14:54:14

标签: shell

我在一个目录中有3个文件,如下所示:

file_str_23.txt  
file_jan_24.txt  
file_feb_25.txt  

这里我想用'file_'替换第一个文件名'file_str',所以最后文件名应该是'file_23.txt'。

问题是我不知道文件名中的确切数字,所以我应该只使用'file_str'字符串。

怎么做?

3 个答案:

答案 0 :(得分:3)

要更改单个文件的名称,请使用mv

mv file_str_23.txt file_23.txt

如果您想批量执行此操作,可以尝试rename,它接受​​正则表达式:

rename 's/_.*?_/_/' file_*

第一个参数是Perl正则表达式替换表达式。一般形式是:

s/WHAT_TO_LOOK_FOR/WHAT_TO_PUT_INSTEAD/

在我们的案例中,WHAT_TO_LOOK_FOR为_.*?_,WHAT_TO_PUT_INSTEAD为_

现在,_.*?_表示:“匹配下划线后跟任意数量的任何字符(.*?),后跟另一个下划线”。例如,在字符串“file_str_23.txt”中,它将匹配“str”。

文件名的匹配部分将替换为_(我们的WHAT_TO_PUT_INSTEAD部分)。

答案 1 :(得分:1)

如果你正在使用bash,你也可以使用这个

for F in file_*.txt ; do 
    mv ${F} file_${F#file_*_}
done

这很容易制作成一行:

for F in file_*.txt ; do mv ${F} file_${F#file_*_} ; done

答案 2 :(得分:1)

你可以试试这个循环,它可以在没有任何外部工具的情况下工作:

for f in *_*_*.txt; do
    mv "$f" "${f/_*_/_}"
done