web-dev-qa-db-ja.com

Linux:tree -i -f -L $ depthはfind-maxdepth $ depthよりも速いと思われますか?

特定のディレクトリにクエリを実行して、特定のパターンのファイルが見つかるかどうかを確認し、2つの異なるコマンドで試してみました。

標準のfindコマンド:

find -L $unix_dir\*/ -maxdepth $maxdepth -name \"$filepattern\"

およびtreeおよびgrepコマンドの置換:

tree -L $maxdepth -l -i -f $unix_dir*/ | grep '$filepattern'

2番目のものは何らかの理由でより速いはずですか?他のコマンドと同じくらい速い場合もありますが、同じくらい速い場合もあり、両方の背後にある理論が何であるかはわかりません。何か案は?

5
719016

2番目のプロセスはtreegrepの2つのプロセスを含み、最初のプロセスはfindを1つしか持たないため、遅いと思います。

さらに、treeは、検出したすべてのファイルの名前を出力ストリームに書き込み、出力ストリームはgrepによって消費されます。同時に、findは一致するファイルの名前のみを出力します。

findを使用すると、ファイル名のみを指定した$filepatternに一致させようとします。 2番目のケースでは、パターンはファイルのフルパスに適用されます。したがって、2番目のケースには、処理するデータが多くあります。


一方、このテストのボトルネックはディスクIOです。findtreeの両方がディレクトリをトラバースします。
各テストを次々に実行すると、OSはディレクトリとファイル名に関するデータをキャッシュするため、コマンドはより速く完了します。

1
Alexey Ivanov

コマンドfindは、常にファイルへのフルパスを書き込むため、画面にさらに多くの文字を書き込みます。また、ファイルパターンとの比較は、findコマンドで長くなる可能性があります(実装によって異なります)。例:擬似コード:

  • 見つける

    • ファイル名を抽出します
    • ファイル名とファイルパターンを比較する
    • ファイル名とファイルパターンを比較する
0
Zhen