it-swarm.cn

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

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

我试过了:

grep -r 800x600 /

但这不起作用。

我相信我的命令应该做的是递归grep遍历根目录下的所有文件/文件夹,文本为“ 800x600”,并列出搜索结果。

我究竟做错了什么?

56
Level1Coder

我通常使用这种命令风格在多个文件上运行grep

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

这实际上是创建系统上每个文件的列表,然后对于每个文件,使用给定的参数和每个文件的名称执行grep

-xdev参数告诉发现它必须忽略其他文件系统-这对于避免使用诸如/proc之类的特殊文件系统很有好处。但是,它也会忽略普通的文件系统-因此,例如,如果/ home文件夹位于其他分区上,则不会搜索该文件系统-您需要说find / /home -xdev ...

-type f表示仅搜索文件,因此目录,设备和其他特殊文件将被忽略(它仍将递归到目录中,并对其中的文件执行grep-它只会执行grep放在目录本身上,无论如何还是无法使用)。 grep-H选项告诉它始终在其输出中打印文件名。

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

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

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

68
Richard Downer

通常,您实际上并不希望在系统上搜索所有内容。 Linux使用文件节点存储所有内容,因此某些“文件”不是您要搜索的内容。例如,/dev/sda是第一个硬盘驱动器的物理块设备。您可能想搜索已挂载的文件系统,而不是原始磁盘设备。还有/dev/random,每次读取时都会散出随机数据。搜索没有任何意义。 /proc文件系统在您的情况下也有问题。

我建议两件事之一。

  1. 不要从根本上搜索,仅搜索可能有用的地方。分别搜索/home/usr/etc。您要查找的信息可能是特定类型的,因此总有可能位于特定文件夹中。配置设置应位于/etc中。您的个人数据文件应位于/home中。像这样将搜索范围限制在一个主要区域,将大大减少递归性问题。

  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
15
Caleb

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

要使用的是,安装后:

ack-grep pattern /
3
bbaja42

另一种查看方式是:

grep -r /* | grep "800x600"
2
maniat1k

*然后我得到一个/ proc/sysrq-trigger:输入/输出错误

您的命令正在运行,您正在收到此错误,因为您正在尝试扫描正在运行的进程中的字符串。

我建议使用

grep -exclude-dir = {proc,sys}“ 800x600” /

0
Koffee