在所有文件中搜索文本字符串的Unix命令

8

我该如何让Unix在所有文件中搜索字符串"hello"?

我已经尝试了以下方法,但是并没有成功:

sudo grep "hello" | find / -name "*" 2>/dev/null

有没有其他想法?

谢谢。

3个回答

28
也许是这个吗?
sudo cd / && grep -rn "hello" *

编辑:当然,'n'选项并不是必需的-它只是显示行号,我觉得很好。 'r'选项告诉grep在目录中执行递归搜索。


2
如果目录中有很多文件,指定“.”可能比“*”更可取。(否则会出现太多参数错误) - Evert
@NBenatar 考虑了这个解决方案,但我认为这个解决方案更容易理解。可能我错了。 - Ivaylo Strandjev
4
@izomorphius:你有三个错误。首先,cd将使用sudo执行并切换到“/”,但grep不会作为sudo的用户执行(也就是说,不是作为root执行)。其次,由于cd /在另一个shell中,实际工作目录不会改变,因此grep不会在“/”中运行(除非“/”已经是工作目录,如果是的话,为什么要cd?)。第三,grep -r '' *不会搜索所有文件,因为*不会展开隐藏的文件和目录(以.开头的文件和目录),除非启用shopt -s dotglob(仅适用于bash)。 - sorpigal
我该如何只搜索 .html 文件? - Jerfov2

11

使用

grep -r 'pattern' /

如果您的grep支持-r(GNU grep支持),如果不支持,请使用。
find / -type f -exec grep 'pattern' {} +

如果您的find支持带有+-exec,否则请使用。
find / -type f -printf '%p\0' | xargs -0 grep 'pattern'

如果您的find支持-printf,且您的xargs支持-0,或者
find / -type f -print0 | xargs -0 grep 'pattern'

如果您的find仅支持-print0,而且您的xargs支持-0,则可以使用这种方式。在所有其他情况下,请回退到原始方式。
find / -type f | xargs grep 'pattern'

这是最大程度的兼容性,但某些不寻常的文件名将无法被搜索到,并且制作恶意文件名可能会带来安全风险。

请注意,为了确保搜索所有文件,您必须以root身份运行,并且如果未添加-igrep中,则搜索区分大小写。


find / -type f | xargs grep 'pattern' ==> 适用于AIX! - LeoPucciBr

2
这个吗?
find . -exec grep -H "hello" {} \;

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