Debian/Ubuntu、または FreeBSD で、複数ファイルのファイル名を一括で変更するための覚書。例えば、拡張子が .tar.gz のファイル名の拡張子を全て .tgz に変更したいとか、database_name. で始まるファイル名から database_name. の部分を取除きたいとか、単純に mv *.tar.gz *.tgz とはできない上に、OS や シェルに依っても違うのでその覚書き。
Debian/Ubuntu で使えるコマンドのようで、さくらインターネットのレンタル サーバ(スタンダード プラン/FreeBSD 7.1)では使えませんでした。rename コマンドは、第 3 引数に指定したパターンにマッチしたファイル名についてそれぞれ、第 1 引数で指定した文字列を第 2 引数で指定した文字列に置き換える、という動作を行います。コマンド一発で変更できるので便利ですね。FreeBSD 上でも別途インストールすれば使えるのかも?
# rename .cgi .txt *.cgi hoge.cgi → hoge.txt fuga.cgi → fuga.txt ... # rename .htm .html *.htm piyo.htm → piyo.html ...
# rename hoge. '' hoge.* hoge.123456.sql.gz → 123456.sql.gz hoge.789012.sql.gz → 789012.sql.gz ...
# for fname in *.cgi; do
> mv ${fname} ${fname%.*}.txt
> done
hoge.cgi → hoge.txt
fuga.cgi → fuga.txt
...
# for fname in hoge.*; do
> mv ${fname} ${fname#hoge.}
> done
hoge.123456.sql.gz → 123456.sql.gz
hoge.789012.sql.gz → 789012.sql.gz
...
for でファイル名を変数に放り込んで、ループで回して mv コマンドで一つずつファイル名を変更します。ミソは、ファイル名を取り出す際に変数展開の拡張オプションを指定することで、変数 fname から不要な文字列を取除いている点です。詳細は各シェルのパラメータ展開のあたりにあります。
csh も sh や bash と考え方は同じですが、文法や変数展開の拡張オプションが異なります。
# foreach fname (*.tar.gz)
> mv ${fname} ${fname:s/.tar.gz/.tgz/}
> end
123456.tar.gz → 123456.tgz
789012.tar.gz → 789012.tgz
...
# foreach fname (hoge.*)
> mv ${fname} ${fname:s/hoge.//}
> end
hoge.123456.sql.gz → 123456.sql.gz
hoge.789012.sql.gz → 789012.sql.gz
...