「find」が「stat」または「fstat」になぜそんなに似ているのですか?

「find」が「stat」または「fstat」になぜそんなに似ているのですか?

/usr/bin/find何もせずに意味のあるものを見せようとしていますがstat、まだ有用な結果が出ていません。強制的に抑制すると、statfind はサブディレクトリにまったく降りません。

システムコールのマニュアルページに示すように、そこにはフィールドがgetdentsあるため、決定を下すために必要ないくつかの情報がすでに存在している必要があります。d_typefind

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

関連情報