假设应该使用grep工具,我想在整个文件系统中搜索文本字符串“ 800x600”。
我试过了:
grep -r 800x600 /
但这不起作用。
我相信我的命令应该做的是递归地遍历根目录下所有文件/文件夹中的文本“ 800x600”,并列出搜索结果。
我究竟做错了什么?
grep -r 800x600 / 2>/dev/null
。您也可以尝试以root用户身份运行它。
假设应该使用grep工具,我想在整个文件系统中搜索文本字符串“ 800x600”。
我试过了:
grep -r 800x600 /
但这不起作用。
我相信我的命令应该做的是递归地遍历根目录下所有文件/文件夹中的文本“ 800x600”,并列出搜索结果。
我究竟做错了什么?
grep -r 800x600 / 2>/dev/null
。您也可以尝试以root用户身份运行它。
Answers:
我通常使用这种命令样式来运行grep
多个文件:
find / -xdev -type f -print0 | xargs -0 grep -H "800x600"
这实际上是制作系统上每个文件的列表,然后针对每个文件,grep
使用给定的参数和每个文件的名称执行。
该-xdev
参数表明发现它必须忽略其他文件系统-这对于避免使用诸如/proc
。之类的特殊文件系统很有好处。但是,它也会忽略普通的文件系统-因此,例如,如果/ home文件夹位于其他分区上,则不会搜索该文件系统-您需要说一下find / /home -xdev ...
。
-type f
表示仅搜索文件,因此目录,设备和其他特殊文件将被忽略(它仍将递归到目录中并grep
在其中的文件上执行-它将仅grep
在目录本身上执行,无论如何将无法运行)。告诉它始终在其输出中打印文件名的-H
选项grep
。
find
接受各种选项来过滤文件列表。例如,-name '*.txt'
仅处理以.txt结尾的文件。-size -2M
表示小于2 MB的文件。-mtime -5
表示最近五天内修改过的文件。将它们与-a for 和 -o for 或一起连接,并使用'('
括号')'
将表达式分组(用引号括起来以防止shell解释它们)。因此,例如:
find / -xdev '(' -type f -a -name '*.txt' -a -size -2M -a -mtime -5 ')' -print0 | xargs -0 grep -H "800x600"
查看一下man find
可能的过滤器的完整列表。
-xdev
将排除所有其他文件系统,而不仅仅是特殊的文件系统。(例如,如果您已/home
安装为单独的分区,则不会搜索该分区。)
find: paths must precede expression: /
xargs
通过这样做来避免以更高的效率进行操作find / -xdev -type f -exec grep -H '800x600' +
。
+
末尾的符号find
实际上与执行以下操作xargs
:生成grep
带有多个参数的一个进程。
通常,您实际上并不希望在系统上搜索所有内容。Linux将文件节点用于所有内容,因此某些“文件”不是您要搜索的内容。例如/dev/sda
,第一个硬盘驱动器的物理块设备。您可能要搜索已挂载的文件系统,而不是原始磁盘设备。另外,/dev/random
每次读取时都会散出随机数据。搜索没有任何意义。该/proc
文件系统也是你的情况的问题。
我建议两件事之一。
不要从根本上搜索,仅搜索可能有用的地方。搜索/home
或/usr
或/etc
separatly。您要查找的信息可能是特定类型的,因此总有可能位于特定文件夹中。配置设置应位于中/etc
。您的个人数据文件应位于中/home
。像这样将搜索范围限制在一个主要区域,将大大减少递归性问题。
排除有问题的区域的使用--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
-I
排除二进制文件
Permission denied
错误吗?您是否以root或普通用户身份运行它?