renameはファイル名を一括置換してくれる便利なコマンドです。
takk@deb8:~/tmp$ touch {1..5} takk@deb8:~/tmp$ ls 1 2 3 4 5 takk@deb8:~/tmp$ rename s/^/test/ * takk@deb8:~/tmp$ ls test1 test2 test3 test4 test5 takk@deb8:~/tmp$
fileコマンドでrenameを確認してみます。
takk@deb8:~/tmp$ which rename | xargs file /usr/bin/rename: symbolic link to /etc/alternatives/rename takk@deb8:~/tmp$
シンボリックリンクを一つ一つ辿るときりがないので一気に確認します。
takk@deb8:~/tmp$ !! -L which rename | xargs file -L /usr/bin/rename: C source, ASCII text takk@deb8:~/tmp$
C sourceと表示されていますが、headで見てみましょう。
takk@deb8:~/tmp$ which rename | xargs head #!/usr/bin/perl -w eval 'exec /usr/bin/perl -w -S $0 ${1+"$@"}' if 0; # not running under some shell # $Revision: 331 $$Date: 2013-04-30 21:23:41 +0100 (Tue, 30 Apr 2013) $ # Robin's RCS header: # RCSfile: rename.PL,v Revision: 1.3 Date: 2006/05/25 09:20:32 # Larry's RCS header: # RCSfile: rename,v Revision: 4.1 Date: 92/08/07 17:20:30 # takk@deb8:~/tmp$
シェバンを見るとperlスクリプトのようです。
つまり、renameコマンドはperlスクリプトです。ということは、renameコマンドの正規表現はperlの正規表現がそのまま使えることになります。
takk@deb8:~/tmp$ ls test1 test2 test3 test4 test5 takk@deb8:~/tmp$
これらのファイルの添字をsprintfを使って3桁0埋めの数字に変更してみます。
takk@deb8:~/tmp$ rename 's/(\d+)/sprintf("%03d",$1)/e' * takk@deb8:~/tmp$ ls test001 test002 test003 test004 test005 takk@deb8:~/tmp$
変更されました。
コメント
This is very interesting, You’re a very skilled blogger. I have joined your feed and look forward to seeking more of your magnificent post. Also, I have shared your site in my social networks!