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"となります。
Posted by yujiro このページの先頭に戻る
- VMをundefineできない場合の対処
- cpanflute2でエラーになる場合の対処
- シェルスクリプトをバイナリ化する「shc」
- OpenSSLで文字列を暗号化・複号化する方法
- sshログインに時間がかかる場合の対処
- vi/vimで範囲指定して置換する方法
- vi/vimでマークした行に移動する方法
- vi/vimで複数行を一括削除する方法
- LinuxでOSキャッシュをクリアする方法
- lessで検索文字列だけを表示する方法
- tailコマンドでファイルがローテートされても追従する方法
- svnでファイルやディレクトリを削除する方法
- phpMyAdminで「unknown system variable 'lc_messages'」となる場合の対処
- Linux(CentOS)でapxsがみつからない場合の対処
- PHP7.3とApacheを連携させる方法
トラックバックURL
コメントする
greeting