私は歴史的に次のことをしてきました。
find . 2>/dev/null | xargs grep -i something_to_find 2>/dev/null
私pwd
がbarfoo(/foo/bar/baz/foofoo/foobar/foobaz/barfoo
)なら、一致するものを探します。ただしcd
、これを行うと、/foo
一致するものが見つかりません。
状況:
- 権限はすべて775です。
- ディレクトリはシンボリックリンクではありません
- すべて同じファイルシステム/サーバーにあります。
-maxdepth
クエリに機能するデフォルト値があるのか、それとも機能しないようにする他の制限があるのか疑問に思います。
追加情報:
すばらしいコメントが投稿されました。以下は、いくつかの追加情報です。
- これはPOSIXではなくGNU用です。
find --version
:GNUバージョン4.2.27を探すgrep --version
:(GNU grep) 2.5.1xargs --version
:GNU xargs バージョン 4.2.27- STDERR リダイレクトを削除しても、結果に影響はありませんし、まったく影響を与えません。
- (動作することが知られています)には
barfoo
スペースはありませんが、他のディレクトリのファイルには/foo/bar
スペースがある可能性があります。しかし、これに関する問題が何であるかはわかりません。 - パスを指定していないことを知っていますが、名前が正しく指定されたディレクトリなので、他のデバイスと混同しないでください。
興味深い結果:
最初は機能しませんが、2番目は機能します。
find . -type f | xargs grep -i something_to_find
find . -type f -name "*.ext" | xargs grep -i something_to_find
これ以上のことは、これがうまく-name "*.*"
いかないことです。ファイル拡張子を指定する必要があり、これが何かを検索するときに問題が発生する可能性があります。
最大エラー数または最大バッファサイズの後に終了するかどうかを知りたいです。このディレクトリには多くのファイルがあることを知っていますが、ファイルの種類を指定すると(結果に制限がある)機能することは興味深いものです。
答え1
名前にスペースがあるディレクトリ(visible/foo/bar
およびnot visible barfoo
)が原因である可能性が高いです。xargs
出力をスペースに分割し、引用符、バックスラッシュ、さらに解釈します_
。手動詳細については、ファイルまたはディレクトリ名にスペースが含まれている場合、不完全なファイル名がgrep
。
この問題を解決するには、find -print0
次のように使用しますxargs -0
。
find . -print0 2>/dev/null | xargs -0 grep -i something_to_find 2>/dev/null
この-print0
オプションは、find
ファイル名が有効なファイル名には現れないバイナリゼロ文字で区切られていることを示します。この-0
オプションは、セクションに同じ文字を区切り文字として使用し、引用符とバックスラッシュを解釈しないように指示します。
答え2
最近の編集内容を考慮して上記のコメントを再度お知らせしたいと思います。
「同じサーバー」に言及しましたが、/proc/kcoreや/dev/zeroなどの特殊ファイルがパスのどこにでも存在できますか?これはgrepがもはや進行するのを確実に防ぐでしょう...
拡張を追加すると、これらのルールスペースなしで他の結果が生成されるため、これが犯人になります。
答え3
努力する
grep -r something_to_find 2>/dev/null
"grep -r ..." は $PWD のすべてのファイルを再帰的に検索します。
答え4
この試み:
find . -type f -print0 | tee /tmp/file-list | xargs -0 egrep whatever
/tmp/file-list(nullを気にしないものとして見る)に必要なファイルが含まれていますか?そうでない場合は検索の問題です。その場合、xargsに問題があるのです。
私は意図的にこれらのエラーを削除しません。役に立ちます。