両方のコマンドを試しましたが、このコマンドは 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
方法と同様に、見つかった各名前のフルパスを一致させることです。grep
filename
-path '*filename*'
find
これらの混乱は、find
物事がどのように機能するかについての誤解から来ています。
このユーティリティには一部が必要です。道このパスの下のすべての名前を返します。
それからあなたはできます限界ファイル名、パス、タイムスタンプ、ファイルサイズ、ファイル形式などで機能できるさまざまなテストから返された名前を使用してください。
言うと
find a b c
find
3つのパスと利用可能な各名前を一覧表示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つだけです)。
その後、cd
1つのレベルに上がって再試行します。
$ cd ..
$ pwd
/home
$ find .profile
find: .profile: No such file or directory
find
これで、コマンドは名前付きパスを見つけることができません.profile
。
ただし、現在のディレクトリを表示するように指示した場合返される名前は次のように制限されます。.profile
、そこからも探します。
$ pwd
/home
$ find . -name '.profile'
./kk/.profile