ゆるゆるエンジニアの技術メモ

神奈川在住のITエンジニアの忘備録です。主にプログラミング(Perl, Java など)やネットワーク技術について、学んだことを自分の中で整理するために書いています。書いたことが誰かのご参考になれば幸いです。

引数で指定したディレクトリ配下から、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は、こういったちょっとしたスクリプトが書きやすくて良いですね~。