我历史上曾执行过类似的操作:
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.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 "*.*"
不起作用,必须给出文件扩展名;这在搜索某些东西时可能会出现问题。
我想知道在最大错误计数或最大缓冲区大小之后是否有终止。我知道这些目录中有很多文件,但事实上它在指定文件类型(限制结果)时有效,这一点很有趣。
答案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 的问题了。
我故意不消除这些错误。它们可能有用。