技術メモ

神奈川在住のITエンジニアの備忘録。おもにプログラミングやネットワーク技術について、学んだことを自分の中で整理するためにゆるゆると書いています。ちゃんと検証できていない部分もあるのでご参考程度となりますが、誰かのお役に立てれば幸いです。

引数で指定したディレクトリ配下から、BOM付きのファイルを探してくるスクリプト

引数で指定したディレクトリ配下から、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があればそのファイル名を標準出力する。

perlは、こういったちょっとしたスクリプトが書きやすくて良いですね~。