私が開発しているPerlスクリプトについて、以下を探しています。早くそして信頼できる指定されたディレクトリ(遷移的)で葉であるすべてのサブディレクトリ、つまり独自のサブディレクトリがないサブディレクトリを見つける方法です。たとえば、次のような階層があるとします。
foo/
foo/bar/
foo/bar/baz
foo/you_fool
引数を使用して呼び出すと、私の仮想関数は"foo"
listを返す必要があります("foo/bar/baz/", "foo/you_fool/")
。
File::Find
これは明らかにまたは同等のものが必要であり、すでに見つかったstat
すべてのファイルに対してシステムコールを実行するため、早く各ファイルに対して追加の操作を実行してstat
も、各ファイルに対して他の操作を実行しないことを意味します。stat
目次つまり、値は$File::Find::dir
大丈夫です。
私の主なターゲットシステムはDarwin(別名MacOS)なので、残念ながら;nlink
フィールドは使用できませんstruct stat
。そのファイルシステムでは意味がないようです。私は「実際のUnix」ファイルシステムでnlink
各ディレクトリを2と比較できることを知っています。
重要な場合は、シンボリックリンク、特殊ファイル、その他すべての奇妙な項目を無視できます。検索する階層は非常にきれいで規則的です。
ベストアンサー1
次のことができます。
perl -MFile::Find -le '
find(sub {
if (-d _) {
undef $leaves{$File::Find::name};
delete $leaves{$File::Find::dir};
}
}, ".");
print for keys %leaves'
undef
現在のディレクトリのハッシュ要素をundef
値に設定し、delete
親ディレクトリのハッシュ要素を削除します。したがって、最終ハッシュキーには%leaves
リーフのみが含まれます。
の場合、現在のファイルで実行されている情報を再利用するため、-d _
追加/操作は行われません。単独で追加が行われます。つまり、ディレクトリへのシンボリックリンクに対してもtrueを返します。lstat()
File::Find
lstat()
stat()
-d
stat()
lstat()
テストでは効果がありましたが、効率的で将来保証型ではない可能性があります。文書には次のように記載されています。
["follow"を含む]保証済み統計資料ユーザーの "wanted()" 関数を呼び出す前に呼び出されました。これにより、「_」関連ファイルをすばやく確認できます。次の場合、この保証は無効になります。フォローするまたはクイックフォロー設定なし。
これはより安全ですが、各ファイルに対して追加の操作を実行するのはif (! -l && -d _)
費用がかかります。lstat()