Linux

Linux: 是否找到 |xargs grep 有限制嗎?

  • March 20, 2018

我曾經做過類似的事情:

find . 2>/dev/null | xargs grep -i something_to_find 2>/dev/null

如果 mypwd是 barfoo ( /foo/bar/baz/foofoo/foobar/foobaz/barfoo),它會找到匹配項。但是,如果 I cdto /foo,它將不再找到匹配項。


條件:

  • 權限都是775
  • 目錄不是符號連結
  • 它們都在同一個文件系統/伺服器上

所以我很好奇是否有一個預設值-maxdepth應用於查找,或者是否有其他限制說明為什麼這不起作用?


附加資訊:

一些很棒的評論已經發布。以下是一些附加資訊:

  • 這是針對 GNU,而不是 POSIX
  • find --version: GNU 查找版本 4.2.27
  • grep --version: (GNU grep) 2.5.1
  • xargs --version: GNU xargs 版本 4.2.27
  • 刪除 STDERR 的重定向對結果沒有影響,或者沒有結果
  • (已知有效)中文件的路徑barfoo沒有空格,但是其他目錄中的文件/foo/bar可能有空格;不過,我不明白這會有什麼問題
  • 我意識到我並沒有具體說明路徑,但這些都是命名良好的目錄,不要與任何設備混淆

有趣的發現:

第一個不起作用,但第二個起作用:

  1. find . -type f | xargs grep -i something_to_find
  2. find . -type f -name "*.ext" | xargs grep -i something_to_find

更奇怪的是,-name "*.*"它不起作用,必須給出文件副檔名;這在搜尋某些東西時可能會出現問題。

我想知道在最大錯誤計數或最大緩衝區大小後是否終止。我知道這些目錄中有很多文件,但它在指定文件類型(限制結果)時起作用的事實很有趣。

名稱中包含空格的目錄,從 可見/foo/bar而不從可見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 字元分隔文件名,該字元不能出現在有效文件名中。相應的-0選項告訴 part 使用相同的字元作為分隔符,並且不解釋引號和反斜杠。

引用自:https://unix.stackexchange.com/questions/52829