Akira's Blog

神奈川在住のITエンジニアの雑記です。主にプログラミング(Perl, Java など)やネットワーク技術についての小ネタを、ちょっとずつ書いていきます。

指定したディレクトリ配下のファイルから改行コード LF を探し出すスクリプト

引数で指定したディレクトリ配下のファイルから改行コード LF を探し出すperlスクリプト detectLF.pl を作成した。
使い方は簡単で、「perl detectLF.pl "ディレクトリ"」を実行するだけ。

use strict;
use warnings;

my $dir = $ARGV[0];
if(! -d $dir) {
    die "Invalid argument.";
}

my @fileList;
getFileList($dir, \@fileList);

foreach my $file (@fileList) {
    if(-f $file) {
        open(my $fh, $file);
        binmode $fh; # If not, all linefeeds are changed to "LF" inside Perl.

        my $lineNum = 1;
        foreach my $line (<$fh>) {
            if($line =~ /[^\x0d]\x0a$/) {
                print("$file has LF in line $lineNum.\n");
            }
            $lineNum++;
        }
    }
}

sub getFileList {
    my $dir = shift;
    my $ref_fileList = shift; # for output.
    
    opendir(my $dh, $dir);
    my @fileList = readdir($dh);
    closedir($dh);
    
    foreach my $file (sort @fileList) {
        if($file =~ /^\.{1,2}$/) {
            next;
        }
        
        if( -d "$dir/$file") {
            getFileList("$dir/$file", $ref_fileList);
        }
        else {
            push(@$ref_fileList, "$dir/$file");
        }
    }
}


実行結果は、

C:\Users\testdir/test.txt has LF in line 1.
C:\Users\testdir/test1.txt has LF in line 1.
・・・

のように表示される。

ちなみに、ファイル読み込みの時、

binmode $fh;

としてバイナリモードで読み込んでいる。これがないと、perlの内部でファイルから読み込んだ改行コード CRLF が勝手に LF に変換されるようで、CRLF も LF として検知してしまうため、こうしている。
上記のようにバイナリモードで読み込むと、perl の内部で改行コードの変換が起きず、CRLF は CRLF のまま扱われるので、改行コードを正しく判定できる。