假设应该使用 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
也有问题。
我会推荐两件事之一。
不要从根搜索,只搜索可能有用的地方。分别搜索
/home
或/usr
或。/etc
您正在查找的信息可能属于特定类型,因此它可能位于特定文件夹中。配置设置应该在/etc
.您的个人数据文件应位于/home
.将搜索限制在这样的主要区域将大大减少递归 grep 的问题。--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
答案4
如果您只想在与特定名称模式(例如.txt
文件)匹配的文件中运行搜索文本,您可以执行以下操作:
grep -rlw --include="*.txt" -e "text to search" path/to/dir
w
如果您还想查找搜索文本是文件内容的子字符串的文件,请忽略该选项。