ターミナルからファイル名を一括で変更する

2018.02.07

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

src/ ディレクトリ内の *.jsx というファイルを *.js に変更する

macOS のターミナルで普通の名前変更の場合

find src -name "*.jsx" | sed -e 's/\.jsx$/.js/' | xargs -I{} mv {}x {}

git でバージョン管理されているファイルの場合

find src -name "*.jsx" | sed -e 's/\.jsx$/.js/' | xargs -I{} git mv {}x {}

Linux の場合(動作未確認...)

find src -name "*.jsx" | sed -e 's/\.jsx$/.js/' | xargs -i git mv {}x {}

カレントディレクトリにこんなファイルがある場合に

$ ls -1 src/**/*.js*
src/components/A.jsx
src/components/B.jsx
src/components/C/C.jsx
src/components/D/D/D.jsx

↓を実行すると...

$ find src -name "*.jsx" | sed -e 's/\.jsx$/.js/' | xargs -I{} mv {}x {}

↓のように名前を変更してくれます。

$ ls -1 src/**/*.js*
src/components/A.js
src/components/B.js
src/components/C/C.js
src/components/D/D/D.js

解説

このワンライナーは3つのパートに別れています。

$ find src -name "*.jsx" | sed -e 's/\.jsx$/.js/' | xargs -I{} mv {}x {}

1. find src -name "*.jsx" で名前が .jsx で終わるファイルを見つけて一覧をリストアップする

$ find src -name "*.jsx"
src/components/A.jsx
src/components/B.jsx
src/components/C/C.jsx
src/components/D/D/D.jsx

2. | sed -e 's/\.jsx$/.js/' の部分で、見つけたファイル名の一覧から .jsx の部分を .js に置き換える

ファイル名を 1 つずつ受け取って、 .jsx.js に置き換える

$ find src -name "*.jsx" | sed -e 's/\.jsx$/.js/'
src/components/A.js
src/components/B.js
src/components/C/C.js
src/components/D/D/D.js
  • ※ まだファイル名の変更はしてない
  • ※ リストアップしたファイル名が変わってるだけです
  • 's/\.jsx$/.js/'.jsx$ の部分は「正規表現」

3. 最後に | xargs -I{} mv {}x {} の部分で、ファイル名を変更する

.js に書き換えられたファイル名を 1 つずつ受け取りながら mv コマンドで名前変更

$ ls -1 src/**/*.js*
src/components/A.jsx
src/components/B.jsx
src/components/C/C.jsx
src/components/D/D/D.jsx
$
$ find src -name "*.jsx" | sed -e 's/\.jsx$/.js/' | xargs -I{} mv {}x {}
$
$ ls -1 src/**/*.js*
src/components/A.js
src/components/B.js
src/components/C/C.js
src/components/D/D/D.js

| xargs -I{} mv {}x {} の部分は実際には↓のコマンドに展開されて実行されます

mv src/components/A.jsx     src/components/A.js
mv src/components/B.jsx     src/components/B.js
mv src/components/C/C.jsx   src/components/C/C.js
mv src/components/D/D/D.jsx src/components/D/D/D.js

今回の場合 xargs は受け取ったファイル名を使って、名前変更をする mv コマンドを組み立てています

  1. xargs-I{}{} という文字列がファイル名に置き換えられるようになる
  2. xargssrc/components/A.js を受け取る
  3. mv {}x {}{}src/components/A.js に置き換えられて mv src/components/A.jsx src/components/A.js になる
  4. mv src/components/A.jsx src/components/A.js を実行してファイル名を変更
  5. src/components/B.jsmv src/components/B.jsx src/components/B.js
  6. src/components/C/C.jsmv src/components/C/C.jsx src/components/C/C.js
  7. src/components/D/D/D.jsmv src/components/D/D/D.jsx src/components/D/D/D.js

おしまい