Linux
Linux: 是否找到 |xargs grep 有限制嗎?
我曾經做過類似的事情:
find . 2>/dev/null | xargs grep -i something_to_find 2>/dev/null
如果 my
pwd
是 barfoo (/foo/bar/baz/foofoo/foobar/foobaz/barfoo
),它會找到匹配項。但是,如果 Icd
to/foo
,它將不再找到匹配項。條件:
- 權限都是775
- 目錄不是符號連結
- 它們都在同一個文件系統/伺服器上
所以我很好奇是否有一個預設值
-maxdepth
應用於查找,或者是否有其他限制說明為什麼這不起作用?附加資訊:
一些很棒的評論已經發布。以下是一些附加資訊:
- 這是針對 GNU,而不是 POSIX
find --version
: GNU 查找版本 4.2.27grep --version
: (GNU grep) 2.5.1xargs --version
: GNU xargs 版本 4.2.27- 刪除 STDERR 的重定向對結果沒有影響,或者沒有結果
- (已知有效)中文件的路徑
barfoo
沒有空格,但是其他目錄中的文件/foo/bar
可能有空格;不過,我不明白這會有什麼問題- 我意識到我並沒有具體說明路徑,但這些都是命名良好的目錄,不要與任何設備混淆
有趣的發現:
第一個不起作用,但第二個起作用:
find . -type f | xargs grep -i something_to_find
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 使用相同的字元作為分隔符,並且不解釋引號和反斜杠。