[Linux Shell] bashとsedを使ってファイルの拡張子を一括置換する

hoge.htmとかimage.JPGとかをhoge.htmlやimage.jpgなどと、拡張子だけを一括変更する方法。

ファイルの数が少ない場合は普通にmvすればいいのだが、ディレクトリごと一斉置換したい場合は以下のようにする:

例:*.htmを*.htmlに置換する

# for f in *.htm; do mv $f `echo $f|sed -e "s/htm/html/g"`; done

基本的にsedの/htm/html/g箇所をいじればどんな置換にも対応できる。
なのだが、いつもこんな長いコマンドを打ち込むのはめんどうなので、スクリプトにまとめておくと便利。

例えばこんな感じ:

#!/bin/sh
mv $1 `echo $1|sed -e "s/$2/$3/g"`

これをパスの通った場所に適当な名前を保存しておく。今回はmv しながらsedをするので、mvsedという名前を付けてみた。
忘れずに実行権限をつけておく

$ chmod +x mvsed

使用方法は

mvsed ファイル名 現在の拡張子 置換後の拡張子

本当は拡張子だけでなく、ファイル名全体の置換につかえるのだが、今回の趣旨の都合上、拡張子ということにしておいてください ^^;

で、使用方法。
ファイル1個:
$ mvsed hoge.htm htm html
-> hoge.htm を hoge.htmlに変更

一括置換:
$ for f in *.htm; do mvsed $f htm html;done
-> ディレクトリ内の.htmファイルをすべて.htmlに変更する。

いまどき*.htmもあんまり見かけなくなったけど、その辺は気にしなーい。

関連エントリー:ファイル名のスペースをアンダースコアに変換する方法

コメント

匿名 さんのコメント…
ファイルの拡張子を変更するなら bash 環境なら sed を使わなくとも
for fn in *.htm; do mv $fn ${fn/.htm/.html}; done
で可能かな

人気の投稿