renameで書式付き文字列のファイル名に置換

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$ 

変更されました。

コメント

  1. 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!

タイトルとURLをコピーしました