ファイル名を一括で置換する
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