opendir MYDIR, "$dir";
my @FILES = readdir MYDIR;
closedir MYDIR;
99.9% の確率で、配列の最初の 2 つのエントリは常に「.」のようです。と ".."。true でない場合、スクリプトの後半のロジックに問題があります。ディレクトリエントリが後で表示されるケースに遭遇しました。これは、ファイル システムが破損していることを示していますか? opendirが返すものの既知の順序はありますか?
これは常にオペレーティング システムの順序であり、ソートされていない未加工の状態で表示されます。
その間 。と .. が最初の 2 つのエントリであることがよくあります。これは、作成された最初の 2 つのエントリであるためです。何らかの理由でそれらの1つが削除された場合(通常は防止されているため、不自然なシーケンスを介して)、次のfsck
(または同等の)ディレクトリが修正され、両方が再び存在するようになります。これにより、名前の 1 つがリストの後の場所に配置されます。
したがって、「最初の 2 つのエントリをスキップする」だけではいけません。代わりに、それらを明示的に一致させて拒否します。
順序は OS に依存し、明示的に定義されていません。
それらは簡単に除外できます。
opendir MYDIR, "$dir";
my @FILES = grep !/^\.\.?$/, readdir MYDIR ;
closedir MYDIR;
File::Slurp::read_dirを使用します。デフォルトでは、 .
andを含まないリストを返します..
。