/usr/bin/find
何もせずに意味のあるものを見せようとしていますがstat
、まだ有用な結果が出ていません。強制的に抑制すると、stat
find はサブディレクトリにまったく降りません。
システムコールのマニュアルページに示すように、そこにはフィールドがgetdents
あるため、決定を下すために必要ないくつかの情報がすでに存在している必要があります。d_type
find
stat
なぜ無視する-L
か、-H
何を選ぶべきですか?
答え1
ソースを使用して、ルーク!
GNUfind
ソースコード(バージョン4.2.2を見ています)でディレクトリツリーをナビゲートするコードは、gnulib/lib/fts.c
次のコメントで1123行にあります。
このエントリに対する fts_read の関係を記録します。ほとんどの場合、単にfts_statですが、d_type情報を利用して不要なstat呼び出しを最適化できます。つまり、FTS_NOSTATが適用され、我々がシンボリックリンク(FTS_PHYSICAL)に従わず、d_typeがそれを示す場合いいえディレクトリであれば、まったく計算する必要はありません。その場合はいディレクトリを作成して(現在の)デバイスとinode番号を取得するには、とにかくそれを計算する必要があります。いつか、d_inoが有効であることが知られているディレクトリを最適化することもできます。
だから彼らはあなたが説明した最適化について考えましたが、それを実装しませんでした。
答え2
参照されたマニュアルページゲイデンツLinux固有のものであり、すべてのファイルシステムタイプには適用されません(例:マニュアルページには記載されていません)。procfs
またはnfs
)、一方、GNU探すプラットフォーム固有ではありません(マニュアルページには、考慮すべき便利な機能であるSELinuxが記載されています)。それできるまた、この特別な場合に最適化されています。
機能を使用できますが、マニュアルページでは次のことをお勧めします。
すべてのアプリケーションは返品を正しく処理する必要があります。
DT_UNKNOWN
。
つまり、情報があれば役に立ちますが、それが存在するという保証はありません。
これらすべての欠点のために、開発者はfind
これらの最適化を必要としないと思うかもしれません。意欲のあるユーザーは、ソースコードを詳しく見て、これを行う方法を理解し、適切なifdefの変更を思い出すことができます。
@nateldedge誰かに気づいたここに行くこの方向に。マニュアルfind
に記載されている7.2 d_typeの最適化
この機能が有効になると、find は一部のシステムで readdir が struct dirent のファイル形式を返すという事実を利用します。
機能は初めて言及存在する
2005-01-17 James Youngman <[email protected]>
* configure.in, find/defs.h, find/find.c, find/parser.c, find/pred.c, find/tree.c, find/util.c:
Implemented d_type optimisation but not working correctly, so currently disabled
あとはそうだった。gnulibを使用するように修正これを支えなさい:
2010-04-08 James Youngman <[email protected]>
Adopt the use of the gnulib module d-type.
* import-gnulib.config (modules): Import the d-type module.
* configure.ac: Remove old struct dirent.d_type detection logic
(since we now use the gnulib macro from the d-type module for
this).
しかし、バージョン4.2.2はかなり古いバージョンです(おそらく誤字かもしれません)。4.2.3日付は2004年にさかのぼり、これらの変更ログエントリよりも優先されます。 gitの現在のリリースタグは次のとおりです。4.5.14(2014年半ば)。
最適化の状態に関係なく、d_type
開発者はstat
からのコメントを減らすことに興味があります。4.5.4(2009-03-10) 例:
ftsfind実行可能ファイルは、ディレクトリからこの情報を読み取ったときにファイルのinode番号を取得するためのstat()関数呼び出しを回避することもできます。これはスピードアップを提供しますが、「find . -inum 4001」などの制限されたコマンドセットにのみ適用されます。この修正は、以下にバグ#24342として記載されています。
要約:OPが質問しました
-L、-H、その他のオプションに関係なく統計が必要な理由
その理由は特別なケースなので、スムーズに動作させる必要がある可能性があるstat
すべてのシナリオに適用するのではなく、面倒で時間がかかるからです。find