技術メモ帳 このページをアンテナに追加 RSSフィード

2006-11-20

[]複数のファイルの名前をまとめて変更する 09:08 複数のファイルの名前をまとめて変更するを含むブックマーク 複数のファイルの名前をまとめて変更するのブックマークコメント

複数のファイルの名前を変更する際に、

便利なコマンドというものがある。

いくつかご紹介させていただこう。


カレントディレクトリにあるファイルの名前を、

たとえば、*.html を *.htm と名前を変更するという課題に対し

どのぐらいエレガントに書けるかというのを比較してみる。


まず、普通にやったらどうだろう。

おそらく、for文 をつかうことだろう。

for file in *.html
do
  base=`basename $file .html`
  mv $base.html $base.htm;
done;

zshだともうちょっとスマートにかけて、

for file in *.html
do
  mv $file:r.html $file:r.html;
done;

こんな具合。


for文 が嫌いなネット右翼のために、

xargs を使ってこの問題を解いてみよう。

ls -1 *.html | cut -d. -f1 | xargs -I% -n1 mv %.html %.htm

さらにzshだともっとスマートになります。

echo *.html(:r) | xargs -I% -n1 mv %.html %.htm

Linuxではどうだろうか。

実はまさにコレを行う rename コマンドというものが存在する。

引数は以下のように指定する。

rename fromパターン toパターン 対象ファイル...

このコマンドを使ってこの問題を解いてみよう。

ああ、実にエレガントだ。

rename .html .htm ./*.html

zshには、zmv というコマンドが用意されている。

指定したパターンにマッチしたファイルを

指定したパターンの名前で移動させるというコマンドだ。

このコマンドは、rename とは比較にならないほど強力なコマンドである。

今度、詳細に書く(今週中に!!)

zmv fromパターン toパターン

なお、使用するにあたって

事前にautoloadしておく必要がある。

さて、この問題をzmvでやるとどうなるか。

autoload zmv
zmv -W '*.html' '*.htm'

シングルクォートでグロブをエスケープしなければならないのが

面倒だが、普通は以下のようにエイリアスしておく。

alias zmv='noglob zmv'
zmv -W *.html *.htm

この問題を解決するにあたって最強と言われるコマンド、

perl により実装された file-rename コマンドというものがある。

http://search.cpan.org/~rmbarker/File-Rename-0.02/rename.PL (作者は Larry Wall ...)

使用方法は、以下のようになっている。

file-rename perl-expr 対象ファイル...

今回の問題では以下のようになる。

file-rename 's/.html$/.htm/' ./*

この例は簡単すぎて大してありがたみがわからないかもしれないが、

第一引数に perl実行文 を指定できるというのはすごく魅力的だ。


参考文献:

http://www.linux.or.jp/JM/html/util-linux/man1/rename.1.html

http://search.cpan.org/~rmbarker/File-Rename-0.02/rename.PL

http://zsh.dotsrc.org/Doc/Release/zsh_24.html#SEC229

fcpfcp 2006/11/20 15:13 初めまして。 Windows だと、原理はまったく理解していませんが ren *.html *.htm で一発です。ひょっとして、これは「Windows 最強」ということでしょうか? (冗談です。これは僕が cmd.exe が Unix のシェルより強力だと思っているほぼ唯一の点です。)

lurkerlurker 2006/11/20 23:12 はじめまして。たしかに Windows の Rename って便利ですよね。

>ほぼ唯一の点です。
あと、xcopyってのも便利さで有名ですよ。

fcpfcp 2006/11/23 12:13 xcopy /? して驚きました。 xcopy コマンドの存在は知っていましたが、こんなにいろいろな機能があったんですね。この調子だと、ほかにもいろいろあるかもしれません。教えていただきありがとうございます。やっぱり Windows は変なところで奥が深くて個人的には好きです。

lurkerlurker 2006/11/23 12:38 >教えていただきありがとうございます。
いえいえこちらこそ。ありがとうございます。

>やっぱり Windows は変なところで奥が深くて個人的には好きです。
なんだかんだいってもWindowsって便利ですよね。