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


87

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


14
これは重複した質問ではありません-他の質問は再帰的ではありません
shonkylinuxユーザー2016

回答:


207

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

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

または:

find . -name '*.t1' -exec rename .t1 .t2 {} +

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

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

20
find . -name '*.t1' -exec rename .t1 .t2 {} +
Aaron Blenkush 2015

2
(私のバージョンでrenameは、sedスタイルの置換式は許可されていません。Linuxが大好きです。このようなことを行うには、以前はWindows用のTotalCommanderをインストールする必要がありました。)
Aaron Blenkush 2015

6
"${1%.t1}".t2私が行ったように、誰かがその部分が何をするのか疑問に思っている場合:bash文字列操作を使用して次のことを行います:1 /最初の位置パラメーター$1を取り、.t1文字列リテラルを最後から切り捨てます(パーセント記号%演算子)。2 /.t2文字列リテラルを結果に追加します。
ザック2017

2
名前の変更はOSXで私のために働くが、bashのバージョンは、I MVの前に追加したばかりの「gitの」と今のgitが幸せ:-DであるC / B素晴らしいではありませんでした
bdombro

3
ユーザーfind . -type f -name '*.t1'がフォルダを避けることを好む
GolakSarangi19年

8

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

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

7

または、mmvコマンドをインストールして次の操作を行うこともできます。

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

これ#1が最初のグロブ部分、つまり*in*.t1です。

または、純粋なbashのものでは、簡単な方法は次のようになります。

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

(つまりforlsまたはなどの外部コマンドを使用せずにファイルを一覧表示できますfind

HTH


7
OPでの「再帰的」の使用は、ディレクトリのサブディレクトリ内のファイルの名前変更も指すと思います。
chepner 2014

申し訳ありませんが、#1の意味は何ですか?
inafalcao 2017年

1
これは最初のグロブ部分、つまり*in*.t1
zmo 2017年

再帰的に:$ mmv -n ';*.t1' '#1#2.t2'-n実行するフラグを削除
okliv

5

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

8
lsを解析しないでくださいfind。構文が悪い理由については、同じページを参照してください。また、必ず変数
モニカを復活させてください

2
おかげで、私は知りませんでした。
jrjc 2014
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.