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