2006-11-20
■[unix]複数のファイルの名前をまとめて変更する

複数のファイルの名前を変更する際に、
便利なコマンドというものがある。
いくつかご紹介させていただこう。
カレントディレクトリにあるファイルの名前を、
たとえば、*.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://d.hatena.ne.jp/hujikojp/20061119
- http://d.hatena.ne.jp/Kachila/20061120
- http://d.hatena.ne.jp/shag/20061120
- http://d.hatena.ne.jp/atm/20061121
- http://d.hatena.ne.jp/buko/20061121
- 複数のファイルの名前をまとめて変更する on tcsh
- 複数のファイルの名前をまとめて変更する [memo]
- 複数のファイルの名前をまとめて変更する - Emacs 編
- CPANについて
- kaisehのブログ - TopHatenar部門別トップユーザー一覧・第2版
- kaisehのブログ - TopHatenar部門別トップユーザー一覧・第2版
- goryugo - zmvを使ってファイルのリネームとかを簡単に行う
- 343 http://b.hatena.ne.jp/hotentry
- 270 http://b.hatena.ne.jp/
- 256 http://d.hatena.ne.jp/
- 179 http://reader.livedoor.com/reader/
- 139 http://secure.ddo.jp/~kaku/tdiary/
- 114 http://www.google.co.jp/ig?hl=ja
- 54 http://b.hatena.ne.jp/add?mode=confirm&title=%u6280%u8853%u30E1%u30E2%u5E33 - %u8907%u6570%u306E%u30D5%u30A1%u30A4%u30EB%u306E%u540D%u524D%u3092%u307E%u3068%u3081%u3066%u5909%u66F4%u3059%u308B&url=http://d.hatena.ne.jp/lurker/20061120/1163981280
- 51 http://b.hatena.ne.jp/entrylist?sort=hot
- 39 http://ja.reddit.com/
- 36 http://b.hatena.ne.jp/hotentry?

>ほぼ唯一の点です。
あと、xcopyってのも便利さで有名ですよ。
いえいえこちらこそ。ありがとうございます。
>やっぱり Windows は変なところで奥が深くて個人的には好きです。
なんだかんだいってもWindowsって便利ですよね。