错误:"grep:参数列表太长"

24

我试图运行以下命令,但遇到了“参数过长”错误。你能帮忙吗?

HOST# grep -rl 'pattern' /home/*/public_html/*
-bash: /bin/grep: Argument list too long

是否有一种方法可以覆盖此错误并在所有用户public_html目录中搜索我想要的匹配文件。 同一服务器上大约有500多个用户。


使用xargs将其分解成可管理的块。 - Paul R
@PaulR,你能详细说明一下而不是给提示吗?那会非常有帮助。 - John
前面评论中的链接会带您到xargs的手册页。请注意,您的问题不适合在Stack Overflow上提问,因为它不是一个编程问题 - 请尝试http://superuser.com或http://unix.stackexchange.com。 - Paul R
这对我有用:https://www.saotn.org/bash-grep-through-large-number-files-argument-list-too-long/ - Scientist
1个回答

51

使用find方法

find /home/*/public_html -type f -exec grep -l 'pattern' {} +

+修饰符能够将文件名分组为可管理的块。

然而,您可以使用grep -r来完成此操作。参数应该是目录名,而不是文件名。

grep -rl 'pattern' /home/*/public_html

这只会有500多个参数,而不是成千上万的文件名。


1
没错,GNU的家伙们在给grep添加递归查找文件的参数时真的搞砸了。为什么不给它一个选项来对输出进行排序呢?UNIX命令查找文件的命令名为“find”,而全局搜索文件中的正则表达式并打印结果的命令名为“grep”。如上所示,始终使用正确的工具完成工作。 - Ed Morton
2
我理解你的想法,@EdMorton,但这就像编程语言中的语法糖。有时候它并不是最优的方式,但当一个工具为了帮助我更快、更轻松地完成任务而额外付出一些努力时,我会更加感激。 - Marton Tatai
1
@EdMorton 我认为你会发现许多GNU工具都有方便的选项来替换常见的组合。就像tar的-z选项一样,因为将输入/输出导管到gzip是如此常见。或者像zless这样的工具,它结合了lesszcat,以及添加到less中使其工作的选项。 - Barmar
不仅是GNU工具—— sort 不需要 -u 选项,因为你可以使用 sort | uniq 来实现。我能想到的所有方便选项,比如你提到的那些,都与该工具的意图相同(例如唯一排序,对一个压缩文件进行合并),而给 grep 一个选项来穿越我的目录结构根本与工具的意图无关。为什么不给 catsortsed 和其他类似的工具一个递归查找文件的选项呢?这样做和让 grep 进行递归查找一样没有任何意义。这只是一个坏主意。 - Ed Morton
1
@EdMorton 因为在文件夹中搜索某些内容比打印或排序所有文件要常见得多。顺便说一下,使用 sort -u 的原因不仅仅是方便,而且是高效的;排序的时间复杂度是 O(n log n),因此如果在排序之前过滤掉重复项,可以显著减少排序时间。 - Barmar

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接