「find | grep 'filename'」コマンドが「find 'filename'」よりはるかに遅いのはなぜですか?

「find | grep 'filename'」コマンドが「find 'filename'」よりはるかに遅いのはなぜですか?

両方のコマンドを試しましたが、このコマンドは find | grep 'filename' 単純なコマンドよりも数倍遅いですfind 'filename'

この行動の正しい説明は何ですか?

ベストアンサー1

(私はfindこれがGNUであると仮定しています)

のみ使用

find filename

会議filenameディレクトリの場合は内部名のみを返し、現在のディレクトリに名前がない場合はエラーのみを返すため、より高速です。filenameこれは非常に高速な操作に似ていますls filename(ただし、filenameディレクトリの場合は再帰的です)。

対照的に、

find | grep filename

findリストを作成できます。みんなこれにより、現在のディレクトリと次のディレクトリの名前がgrepフィルタリングされます。これは明らかにはるかに遅い作業です。

私が推測するもの実際にもともと目的はこれでした。

find . -type f -name 'filename'

これにより、現在のディレクトリまたは次のディレクトリでfilename一般ファイルの名前が検索されます。

これは高速または非常に高速ですが、回避策はfind | grep filename方法と同様に、見つかった各名前のフルパスを一致させることです。grepfilename-path '*filename*'find


これらの混乱は、find物事がどのように機能するかについての誤解から来ています。

このユーティリティには一部が必要です。このパスの下のすべての名前を返します。

それからあなたはできます限界ファイル名、パス、タイムスタンプ、ファイルサイズ、ファイル形式などで機能できるさまざまなテストから返された名前を使用してください。

言うと

find a b c

find3つのパスと利用可能な各名前を一覧表示aするようbに求められますc。これが現在ディレクトリにある一般ファイルの名前である場合は、その名前が返されます。そのうちの1つがディレクトリ名の場合は、そのディレクトリ内の他のすべての名前と一緒に返されます。

私がするとき

find . -type f -name 'filename'

.これにより、現在のディレクトリ()以下のすべての名前のリストが生成されます。-type f次に、名前の拡張子filename-name 'filename'。たとえば、文字列はfilenameファイル名のワイルドカードパターンです*.txt(引用符だけを覚えておいてください)。

例:

.profileこれは私のホームディレクトリから呼び出されたファイルを「見つける」ようです。

$ pwd
/home/kk
$ find .profile
.profile

ただし、実際にはパス内のすべての名前を返します.profile(このファイルの名前は1つだけです)。

その後、cd1つのレベルに上がって再試行します。

$ cd ..
$ pwd
/home
$ find .profile
find: .profile: No such file or directory

findこれで、コマンドは名前付きパスを見つけることができません.profile

ただし、現在のディレクトリを表示するように指示した場合返される名前は次のように制限されます。.profile、そこからも探します。

$ pwd
/home
$ find . -name '.profile'
./kk/.profile

おすすめ記事