(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
。これらが現在のディレクトリにある通常のファイルの名前である場合、これらが返されます。それらのいずれかがたまたまディレクトリの名前である場合、そのディレクトリ内のすべての追加の名前とともに返されます。
私がする時
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