特定のディレクトリにクエリを実行して、特定のパターンのファイルが見つかるかどうかを確認し、2つの異なるコマンドで試してみました。
標準のfind
コマンド:
find -L $unix_dir\*/ -maxdepth $maxdepth -name \"$filepattern\"
およびtree
およびgrep
コマンドの置換:
tree -L $maxdepth -l -i -f $unix_dir*/ | grep '$filepattern'
2番目のものは何らかの理由でより速いはずですか?他のコマンドと同じくらい速い場合もありますが、同じくらい速い場合もあり、両方の背後にある理論が何であるかはわかりません。何か案は?
2番目のプロセスはtree
とgrep
の2つのプロセスを含み、最初のプロセスはfind
を1つしか持たないため、遅いと思います。
さらに、tree
は、検出したすべてのファイルの名前を出力ストリームに書き込み、出力ストリームはgrep
によって消費されます。同時に、find
は一致するファイルの名前のみを出力します。
find
を使用すると、ファイル名のみを指定した$filepattern
に一致させようとします。 2番目のケースでは、パターンはファイルのフルパスに適用されます。したがって、2番目のケースには、処理するデータが多くあります。
一方、このテストのボトルネックはディスクIOです。find
とtree
の両方がディレクトリをトラバースします。
各テストを次々に実行すると、OSはディレクトリとファイル名に関するデータをキャッシュするため、コマンドはより速く完了します。
コマンドfind
は、常にファイルへのフルパスを書き込むため、画面にさらに多くの文字を書き込みます。また、ファイルパターンとの比較は、findコマンドで長くなる可能性があります(実装によって異なります)。例:擬似コード:
見つける
木