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

Mor*_*anR 7 unix macos bash grep find

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

我尝试了以下但它不起作用:

sudo grep "hello" | find / -name "*" 2>/dev/null
Run Code Online (Sandbox Code Playgroud)

有没有人有任何其他想法?

谢谢.

izo*_*ica 27

也许这个?

sudo cd / && grep -rn "hello" *
Run Code Online (Sandbox Code Playgroud)

编辑:当然不需要'n'选项 - 它只显示行号,我发现它很好.'r'选项告诉grep在目录中执行递归搜索.

  • @izomorphius:你有三个错误.首先,`cd`将用`sudo`执行并切换到`/`,但`grep`不会被执行为`sudo`'d用户(IOW,而不是root用户).第二,因为`cd /`在另一个shell中,实际工作目录不会改变,`grep`不会在`/`中运行(除非`/`已经是工作目录,在这种情况下为什么`cd`?) .第三,`grep -r''*`不会搜索所有文件,因为```不会扩展隐藏文件和目录(那些带有前导`.`),除非`shopt -s dotglob`生效(仅限'bash`) ). (3认同)
  • 如果目录中有很多文件,则指定`.`可能优于`*`.(你可以点击太多的参数错误) (2认同)

Sor*_*gal 10

使用

grep -r 'pattern' /
Run Code Online (Sandbox Code Playgroud)

如果您grep支持-r,(GNU grep会); 如果不使用

find / -type f -exec grep 'pattern' {} +
Run Code Online (Sandbox Code Playgroud)

如果您的find支持-exec+,否则使用

find / -type f -printf '%p\0' | xargs -0 grep 'pattern'
Run Code Online (Sandbox Code Playgroud)

如果您的find支持-printfxargs支持-0,或

find / -type f -print0 | xargs -0 grep 'pattern'
Run Code Online (Sandbox Code Playgroud)

如果您find只支持-print0xargs支持-0.在所有其他情况下可以依靠

find / -type f | xargs grep 'pattern'
Run Code Online (Sandbox Code Playgroud)

这是最大程度兼容的,但需要注意的是某些不寻常的文件名将无法被删除,并且精心设计的文件名可能会带来安全风险.

请注意,您必须是root用户才能确保搜索所有文件,并且除非您添加-i,否则搜索将区分大小写grep.