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

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

我历史上曾执行过类似的操作:

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

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

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

答案1

名称中包含空格(从 可见/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选项告诉部分使用相同的字符作为分隔符,并且不解释引号和反斜杠。

答案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(使用不介意空值的内容查看它)是否包含您想要的文件?如果没有,那就是查找问题了。如果是的话,那就是 xargs 的问题了。

我故意不消除这些错误。它们可能有用。

相关内容