Linuxでファイル名の一括変換を行う方法

Linuxでファイル名の一括変換を行う方法

Posted at March 26,2014 1:55 AM
Tag:[Linux]

Linuxでファイル名の一括変換を行う方法を紹介します。

1.問題点

あるディレクトリに次の10ファイル(あるいはそれ以上)があるとします。

aaa.txt
bbb.txt
ccc.txt
ddd.txt
eee.txt
fff.txt
ggg.txt
hhh.txt
iii.txt
jjj.txt

これらのファイルの拡張子をすべて「.html」に変更したいのですが、mvコマンドで1ファイルずつ、

$ mv aaa.txt aaa.html
$ mv bbb.txt bbb.html
   :

とリネームを繰り返すのは面倒です。

ということで、ファイル名の一括変換について紹介します。

2.renameコマンドで一括置換する

Linuxにはrenameコマンドが用意されている場合があるので、利用できる場合はこれで一括変換が可能です。

$ rename .txt .html *

フォーマットは次のとおりです。

$ rename 変更前の文字列 変更後の文字列 対象ファイル

ちなみに私の使っているさくらインターネットには用意されていませんでした。

3.Perlのワンライナーで一括置換する

Perlを使ってファイル名の拡張子を変更する場合、次のようにします。

perl -e 'while(<*.txt>) { ($new = $_) =~ s/txt$/html/; rename $_, $new }'

解説です。

まずwhile文を使って、拡張子".txt"のファイル数分処理を繰り返します。

while(<*.txt>) { ... }

s///演算子を使って拡張子を変換したファイル名を変数$newに保持します。

($new = $_) =~ s/txt$/html/;

最後にPerlのrename()でリネームを実施します。

rename $_, $new

4.bashで一括置換する

bashを使ってファイル名の拡張子を変更する場合、次のようにします。

$ cd 目的のディレクトリ
$ for file in *; do
> mv $file ${file%.txt}.html;
> done

解説です。

${file%.txt}

の部分は、bashの「変数展開」または「変数パラメータ展開」と呼ばれる一種で、変数から値を取り出し、その後方部分が%の直後に記述した文字列と一致した場合、その部分を取り除きます。

つまり、

mv $file ${file%.txt}.html;

の対象がaaa.txtである場合、まず、$fileが"aaa.txt"に置き換えられるので

mv aaa.txt ${file%.txt}.html;

となります。次に、${file%.txt}の部分は、前述の変数展開で"aaa"となるので、

mv aaa.txt aaa.html

となり、最後にmvコマンドが実行されることで、"aaa.txt"が"aaa.html"となります。

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


コメントする
greeting

*必須

*必須(非表示)


ご質問のコメントの回答については、内容あるいは多忙の場合、1週間以上かかる場合があります。また、すべてのご質問にはお答えできない可能性があります。予めご了承ください。

太字イタリックアンダーラインハイパーリンク引用
[サインインしない場合はここにCAPTCHAを表示します]

コメント投稿後にScript Errorや500エラーが表示された場合は、すぐに再送信せず、ブラウザの「戻る」ボタンで一旦エントリーのページに戻り(プレビュー画面で投稿した場合は、投稿内容をマウスコピーしてからエントリーのページに戻り)、ブラウザをリロードして投稿コメントが反映されていることを確認してください。

コメント欄に(X)HTMLタグやMTタグを記述される場合、「<」は「&lt;」、「>」は「&gt;」と入力してください。例えば「<$MTBlogURL$>」は「&lt;$MTBlogURL$&gt;」となります(全て半角文字)