複数ファイルのファイル名を一括変更するには?

Posted by
ぴろり
Posted at
2012/09/11 15:04
Trackbacks
関連記事 (0)
Post Comment
コメントできます
Category
開発メモ カテゴリ
カバーイメージ

 Debian/Ubuntu、または FreeBSD で、複数ファイルのファイル名を一括で変更するための覚書。例えば、拡張子が .tar.gz のファイル名の拡張子を全て .tgz に変更したいとか、database_name. で始まるファイル名から database_name. の部分を取除きたいとか、単純に mv *.tar.gz *.tgz とはできない上に、OS や シェルに依っても違うのでその覚書き。

このエントリーをはてなブックマークに追加  

rename コマンドを使う

 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
...

sh/bash の場合

# 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 の場合

 cshshbash と考え方は同じですが、文法や変数展開の拡張オプションが異なります。

# 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
...
このエントリーをはてなブックマークに追加  



関連記事/トラックバック

関連記事/トラックバックはまだありません

この記事にトラックバックを送るには?

コメントを投稿する

 
 (必須, 匿名可, 公開, トリップが使えます)
 (必須, 匿名可, 非公開, Gravatar に対応しています)
 (必須)
スパム コメント防止のため「投稿確認」欄に ランダムな数字 CAPTCHAについて を入力してから送信してください。お手数ですがご協力のほど宜しくお願いいたします。