2014-02-24 110 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