Linux:find | xargs grepに制限はありますか?

Linux:find | xargs grepに制限はありますか?

私は歴史的に次のことをしてきました。

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.1
  • xargs --version:GNU xargs バージョン 4.2.27
  • STDERR リダイレクトを削除しても、結果に影響はありませんし、まったく影響を与えません。
  • (動作することが知られています)にはbarfooスペースはありませんが、他のディレクトリのファイルには/foo/barスペースがある可能性があります。しかし、これに関する問題が何であるかはわかりません。
  • パスを指定していないことを知っていますが、名前が正しく指定されたディレクトリなので、他のデバイスと混同しないでください。

興味深い結果:

最初は機能しませんが、2番目は機能します。

  1. find . -type f | xargs grep -i something_to_find
  2. 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オプションは、セクションに同じ文字を区切り文字として使用し、引用符とバックスラッシュを解釈しないように指示します。

おすすめ記事