引数で指定したディレクトリ配下のファイルから改行コード 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 のまま扱われるので、改行コードを正しく判定できる。