カレントディレクトリのファイル名の一部を一気に変更するワンライナー

例えば、カレントディレクトリに、

testvector_foo_aaa.result
testvector_foo_bbb.result
testvector_foo_ccc.result
testvector_foo_ddd.result

なんてファイルがあったとして、そのファイル名の一部を変更したい…例えば、

testvector_bar_aaa.result
testvector_bar_bbb.result
testvector_bar_ccc.result
testvector_bar_ddd.result

てファイル名に変更したいときのためのPerlスクリプトを書いたょ。オトモダチに使ってもらったら、便利そうだったので、自分で使っても便利だったので、晒すことにしたょ。renameをいっぱいするスクリプトだからrenrenて名前にしてるょ。

renren:

#!/usr/local/bin/perl -w
use strict;
die "Usage: renren <src> <dst>\n" if $#ARGV != 1;
my ($src, $dst) = @ARGV;
grep(($b = $_, $b =~ s/$src/$dst/g, print "\\mv -f $_ $b\n"), (grep(/$src/ && -f , <*>)));

で、上記の例の場合だと、

%renren foo bar
\mv -f testvector_foo_aaa.result testvector_bar_aaa.result
\mv -f testvector_foo_bbb.result testvector_bar_bbb.result
\mv -f testvector_foo_ccc.result testvector_bar_ccc.result
\mv -f testvector_foo_ddd.result testvector_bar_ddd.result

なんて吐いてくるから、てきとーにshellにパイプして下さい。いきなりmvするのは恐いので、実行されるコマンドを確認してからパイプするということでー。

で、これ、実質ワンライナーなので、ワンライナーにしてみたょ。

perl -e 'grep(($b = $_, $b =~ s/$ARGV[0]/$ARGV[1]/g, print "\\mv -f $_ $b\n"), (grep(/$ARGV[0]/ && -f , <*>)));' foo bar

結論

Perlgrepは便利すぎる。