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

vol*_*ron 2 linux grep bash find xargs

我历史上做过类似的事情:

find . 2>/dev/null | xargs grep -i something_to_find 2>/dev/null
Run Code Online (Sandbox Code Playgroud)

如果 mypwd是 barfoo ( /foo/bar/baz/foofoo/foobar/foobaz/barfoo),它会找到匹配项。但是,如果我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 "*.*"不起作用,必须给出文件扩展名;这在搜索某些东西时可能会出现问题。

我想知道在最大错误计数或最大缓冲区大小之后是否终止。我知道这些目录中有很多文件,但它在指定文件类型(限制结果)时起作用的事实很有趣。

小智 7

名称包含空格的目录,可见 from/foo/bar和不 from barfoo,可能是罪魁祸首。xargs用空格分割其输出,并解释引号、反斜杠,甚至_字符——详细信息请参见手册,因此文件名或目录名中的空格会导致它将不完整的文件名传递给grep.

要解决此问题,请find -print0与 结合使用xargs -0,如下所示:

find . -print0 2>/dev/null | xargs -0 grep -i something_to_find 2>/dev/null
Run Code Online (Sandbox Code Playgroud)

-print0选项告诉find用二进制 0 字符分隔文件名,该字符不能出现在有效的文件名中。相应的-0选项告诉 part 使用与分隔符相同的字符,并且不解释引号和反斜杠。