引数で指定したディレクトリ配下から、BOM(Byte Order Mark)付きのファイルを探してきて、そのファイル名を表示するperlスクリプト findBOM.pl を作成した。
使い方は簡単で、「perl findBOM.pl "検索対象ディレクトリ"」で実行できる。なお、Windows環境で使用する場合は、ActivePerl 等のperlの実行環境が必要。
use strict; use warnings; my $dir = $ARGV[0]; if((!$dir) or (! -d $dir)) { die "Need to specify a directory."; } my $isFound = 0; checkBomFrom($dir); if ($isFound == 0) { print "No files which include BOM."; } sub checkBomFrom { my $dir = shift; opendir(my $in, $dir) or die "Failed to open $dir: $!"; my @fileList = readdir($in); closedir($in); foreach my $file (@fileList){ if($file =~ /^\.{1,2}$/){ next; } if( -d "$dir\\$file"){ checkBomFrom("$dir\\$file"); } else{ printFileNameIfIncludeBom("$dir\\$file"); } } } sub printFileNameIfIncludeBom { my $file = shift; if(-f $file) { open(my $in, $file) or die "Failed to open $file: $!"; my $firstLine = <$in>; close($in); return if (!$firstLine); if($firstLine =~ /^\xef\xbb\xbf/) { print $file; if ($isFound == 0) { $isFound = 1; } } } }
簡単に説明すると、指定されたディレクトリ配下のファイルを一つずつopenし、一行目だけ読み込み、先頭にBOM(0xefbbbf)があるかどうかチェックする。BOMがあればそのファイル名を標準出力する。