2014-02-24 78 views
42

我想循环遍历一个目录,并将某个扩展名的所有文件的扩展名(例如.t1)更改为.t2。什么是这样做的bash命令?在Bash中递归更改文件扩展名

+6

恕我直言,这不是一个重复的问题 - 其他问题不是递归的 –

回答

102

如果你有重命名可用,那么使用:

find . -name "*.t1" -exec rename 's/\.t1$/.t2/' '{}' \; 

如果重命名不可用,则使用:

find . -name "*.t1" -exec bash -c 'mv "$1" "${1%.t1}".t2' - '{}' \; 
+10

'发现。 -name'* .t1'-exec rename .t1 .t2 {} +' –

+2

(我的'rename'版本不允许使用sed风格的替换表达式,总喜欢Linux,我以前必须安装TotalCommander for Windows做这样的东西。) –

+1

请使用参数扩展,而不是一个丑陋的'sed'! –

1

我会做这样在bash:

for i in $(ls *.t1); 
do 
    mv "$i" "${i%.t1}.t2" 
done 

编辑: 我的错误:它不是递归的,这是我递归更改文件名的方式:

for i in $(find `pwd` -name "*.t1"); 
do 
    mv "$i" "${i%.t1}.t2" 
done 
+7

[不要分析ls](http://mywiki.wooledge.org/ParsingLs),并查看相同的页面,为什么你的'find'语法不好。另外,请确保你[引用你的变量](http://mywiki.wooledge.org/BashGuide/Practices#Quoting) – BroSlow

+2

谢谢,我不知道。 – jrjc

6

或者你可以简单地安装mmv命令并执行:

mmv '*.t1' '#1.t2' 

这里#1是第一水珠部分即在*.t1*

或者纯bash的东西,一个简单的办法是:

for f in *.t1; do 
    mv "$f" "${i%.t1}.t2" 
done 

(即:for可以列出文件,而无需外部命令的帮助,如lsfind

HTH

+4

我假设OP使用“递归”是指重命名目录的子目录中的文件。 – chepner

+0

对不起,但是#1的含义是什么? – inafalcao

+1

它是第一个glob部分,即'* .t1'中的'*' – zmo

7

如果您的bash版本支持globstar选件(版本4或更高版本):

shopt -s globstar 
for f in **/*.t1; do 
    mv "$f" "${f%.t1}.t2" 
done