作曲・指導・C言語・Linux

金沢音楽制作

金沢音楽制作では、楽曲・楽譜の制作と、作曲や写譜などレッスンを行っています。

ファイル名を一括で置換する

LinuxやmacOSのターミナルからファイル名を一括で置換する方法です。一番最初に提示するsedを使った方法が環境に依存しないのでおすすめです。

sedを便利に使うコツは、\([pattern]\)でレジスタを利用することです。登録順に\1\2と格納されます。例として、拡張子付きのファイルをベース名と拡張子に分解してみます。

$ ls | sed 's/\(\(.*\)\.\(.*\)\)/\1 \2 \3/'
a.out a out
loop.c loop c
rename.c rename c

\1にファイル名が、\2にベース名が、\3に拡張子が格納されていることが分かります。ちなみに、GNUのsedでは、\0にパターンが格納されるので、同じ内容をより簡潔に表現できます。

$ ls | gsed 's/\(.*\)\.\(.*\)/\0 \1 \2/'

環境:Linux Mint19、bash 4.4.20

sedでmvの文字列を作る

前述したとおりsedを使ってmvコマンドの文字列を作成し、パイプでbashに渡す方法が汎用性が高く、また安全だと思います。

次の例は、ファイル名の中から-minという文字列を除外するために、sedを使って、mvに続く引数を作り上げています。

$ ls | sed -n 's/\(.*\)-min\(\..*\)/mv \0 \1\2/p'
mv blue-min.png      blue.png
mv delek-min.png     delek.png
mv evening-min.png   evening.png
mv murphy-min.png    murphy.png
mv darkblue-min.png  darkblue.png
mv desert-2-min.png  desert-2.png
mv industry-min.png  industry.png
mv pablo-2-min.png   pablo-2.png

この表示を確認して問題がなければ、パイプ(|)でbashに渡してmvを実行させます。

$ !! | bash
$ ls 
blue.png
delek.png
evening.png
murphy.png
darkblue.png
desert-2.png
industry.png
pablo-2.png

!!は直前に実行したコマンドが格納されている変数です。

renameコマンドを使う

renameコマンドを使って、-minを置換で削除します。

$ ls
blue-min.png      delek-min.png      evening-min.png    murphy-min.png
darkblue-min.png  desert-2-min.png   industry-min.png   pablo-2-min.png

renameは、簡単で便利ですが、全ての環境に用意されている訳ではありません。使い方は、第1引数にsedの置換を、第2引数に対象ファイルを記述するだけです。renameはディレクトリも対象なので、ファイルのみの場合はls -F | grep -v /といった対策が必要です。今回は、拡張子.pngがついたファイルが対象ですから、ワイルドカード展開(*)を使います。

$ rename 's/-min//' *.png
$ ls
blue.png      delek-2.png   elflord-2.png  koehler-2.png  pablo-2.png
darkblue.png  delek.png     elflord.png    koehler.png    pablo.png

シェルスクリプトを作成する

最後は、シェルスクリプトにしてしまう方法です。かなりの力技ですが、簡単な上に確実性が高いです。

まず、リダイレクトを使ってlsの結果をファイルに書き出します。次に、エディタでそのファイルを開きます。そして、mvでリネームするコマンドを書いて実行します。

$ ls > rename.sh
$ vi !$
mv blue-min.png blue.png
mv delek-min.png delek.png
mv evening-min.png evening.png
mv murphy-min.png murphy.png
mv darkblue-min.png darkblue.png
mv desert-2-min.png desert-2.png
mv industry-min.png industry.png
mv pablo-2-min.png pablo-2.png
$ bash !$
$ ls
blue.png
delek.png
evening.png
murphy.png
arkblue.png
desert-2.png
industry.png
pablo-2.png

!$は、直前のコマンドの最後の引数が格納されています。今回の場合であれば、rename.shです。

更新情報

  • 公開日:2018-11-14
  • 更新日:2019-10-15
  • 更新日:2020-02-27
  • 更新日:2020-12-22
  • 更新日:2022-04-27