コマンドラインで複数ファイルに対してちょっとした変換を行った際、変換されなかったファイルを一覧する方法を紹介。
% ls
aaa.txt bbb.txt ccc.txt
% perl convert_command.pl *.txt
% ls
aaa.txt aaa.txt.bak bbb.txt bbb.txt.bak ccc.txt
% find . -type f | perl -n -e ‘chomp; m/\.bak$/ or -e “$_.bak” or print “$_\n”‘
ccc.txt
aaa.txt bbb.txt ccc.txt
% perl convert_command.pl *.txt
% ls
aaa.txt aaa.txt.bak bbb.txt bbb.txt.bak ccc.txt
% find . -type f | perl -n -e ‘chomp; m/\.bak$/ or -e “$_.bak” or print “$_\n”‘
ccc.txt
解説
convert_command.pl は何かの変換スクリプトの想定。
実際に変換を行った時だけ元のファイルを 「(元のファイル名).bak」 で保存する仕様。
私はよくプログラムやHTMLファイルの特定の表現を一括変換するスクリプトを使っています。
ファイルが変換されたら cvs diff などで差分が期待通りかを確認すればよいのだが、変換されるべきファイルが全て変換されたかを確認するのは、ファイルが10を超えてくると面倒くさい。
それを検出するのが「find」で始まる行。
find でディレクトリ内のファイルを一覧し perl にパイプに渡す。
perl は、『「ファイル名自体に .bak」がついている』または『 「ファイル名.bak」ファイルがある』のどちらも満たさなければそのファイル名を出力する。
ということで、.bak ファイルができていないファイルを一覧できます。