web-dev-qa-db-ja.com

Bashでファイル拡張子を再帰的に変更する

ディレクトリを再帰的に繰り返し処理し、特定の拡張子のすべてのファイルの拡張子を変更したい、たとえば.t1から.t2。これを行うためのbashコマンドは何ですか?

65
Amal Antony

名前を変更できる場合は、次を使用します。

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

名前を変更できない場合は、次を使用します。

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

bashのバージョンがglobstarオプションをサポートしている場合(バージョン4以降):

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

または、単に mmv コマンドをインストールして実行することもできます。

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

ここに #1は最初のグロブ部分、つまり* in *.t1

または、純粋なbashの場合、簡単な方法は次のとおりです。

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

(つまり:forは、lsfindなどの外部コマンドの助けを借りずにファイルをリストできます)

HTH

6
zmo

私は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
2
jrjc