如何在整个文件系统中搜索文本?

如何在整个文件系统中搜索文本?

假设应该使用 grep 工具,我想在整个文件系统中搜索文本字符串“800x600”。

我试过:

grep -r 800x600 /

但它不起作用。

我相信我的命令应该做的是递归地 grep 遍历 root 下的所有文件/文件夹以查找文本“800x600”并列出搜索结果。

我究竟做错了什么?

答案1

我通常使用这种风格的命令来运行grep多个文件:

find / -xdev -type f -print0 | xargs -0 grep -H "800x600"

它实际上所做的是列出系统上的每个文件,然后对于每个文件,grep使用给定的参数和每个文件的名称执行。

-xdev参数告诉 find 它必须忽略其他文件系统 - 这有利于避免特殊文件系统,例如/proc.但是,它也会忽略普通文件系统 - 例如,如果您的 /home 文件夹位于不同的分区上,则不会搜索它 - 您需要说find / /home -xdev ....

-type f意味着仅搜索文件,因此目录、设备和其他特殊文件将被忽略(它仍然会递归到目录并grep在其中的文件上执行 - 它只是不会grep在目录本身上执行,这无论如何都不起作用)。选项-H告诉grep它始终在输出中打印文件名。

find接受各种选项来过滤文件列表。例如,-name '*.txt'仅处理以 .txt 结尾的文件。-size -2M表示小于 2 MB 的文件。-mtime -5表示最近五天内修改的文件。用 -a for 将它们连接在一起和 -o 为或者,并使用'('括号')'对表达式进行分组(用引号括起来以防止 shell 解释它们)。例如:

find / -xdev '(' -type f -a -name '*.txt' -a -size -2M -a -mtime -5 ')' -print0 | xargs -0 grep -H "800x600"

查看man find可能的过滤器的完整列表。

答案2

通常您不会想要实际搜索系统上的所有内容。 Linux 对所有内容都使用文件节点,因此某些“文件”不是您想要搜索的内容。例如,/dev/sda您的第一个硬盘驱动器的物理块设备。您可能想要搜索已安装的文件系统而不是原始磁盘设备。还有一种/dev/random方法是在您每次阅读时都会输出随机数据。搜索没有多大意义。您的情况下文件系统/proc也有问题。

我会推荐两件事之一。

  1. 不要从根搜索,只搜索可能有用的地方。分别搜索/home/usr或。/etc您正在查找的信息可能属于特定类型,因此它可能位于特定文件夹中。配置设置应该在/etc.您的个人数据文件应位于/home.将搜索限制在这样的主要区域将大大减少递归 grep 的问题。

  2. --exclude-dir使用和一组您知道不需要的东西排除有问题的区域,如下所示:
    grep -r --exclude-dir /proc --exclude-dir /dev --exclude-dir /tmp --exclude-dir /lost+found

最后,在执行大型递归 grep 时遇到一些“权限被拒绝”错误的情况并不少见。在正常使用过程中,有些文件您的用户可能无法读取。只要这些只是一些奇怪的文件,而不是硬盘驱动器的原始设备或整个 proc 文件系统之类的东西,就可以忽略这些错误。事实上,您可以在命令行上通过将所有错误发送到 never never land 来执行此操作:

grep -r search_string /path 2> /dev/null

答案3

为了简单起见,我建议ack-grep。链接显示了许多情况,何时ack-grep是更好的选择。

使用方法是,安装后:

ack-grep pattern /

答案4

如果您只想在与特定名称模式(例如.txt文件)匹配的文件中运行搜索文本,您可以执行以下操作:

grep -rlw --include="*.txt" -e "text to search" path/to/dir

w如果您还想查找搜索文本是文件内容的子字符串的文件,请忽略该选项。

相关内容