是的,您可以grep
/dev/sda1
,/proc
但您可能不想这样做。更详细地:
是的,您可以运行grep的二进制内容/dev/sda1
。但是,对于现代大型硬盘,这将花费很长时间,并且结果可能不会有用。
是的,您可以grep的内容,/proc
但要注意您的计算机内存已作为文件映射到其中。在具有千兆字节RAM的现代计算机上,这将花费很长时间进行grep,并且再次,结果不太可能有用。
作为例外,如果要在文件系统已损坏的硬盘上查找数据,则可能会在grep something /dev/sda1
尝试恢复文件数据的过程中运行。
中的其他有问题的文件 /dev
/dev
如果有足够的耐心,则可以将下面的硬盘和硬盘分区改写。但是,其他文件(提示:user2313067)可能会引起问题:
/dev/zero
是无限长度的文件。幸运的是,grep
(至少是GNU版本)足够聪明,可以跳过它:
$ grep something /dev/zero
grep: input is too large to count
/dev/random
并且/dev/urandom
也是无限的。该命令grep something /dev/random
将永远运行,除非grep
发出停止信号。
/dev/urandom
生成密码时grep很有用。例如,要获得五个随机的字母数字字符:
$ grep --text -o '[[:alnum:]]' /dev/urandom | head -c 10
G
4
n
X
2
这不是无限的,因为在收到足够的字符后,它将head
关闭管道,从而导致grep终止。
无限循环
“ ...链接...遍历时会创建无限循环...”
Grep(至少是GNU版本)足够聪明,无法做到这一点。让我们考虑两种情况:
使用该-r
选项时,除非在命令行上明确指定,否则grep 不会跟随符号链接。因此,无限循环是不可能的。
使用该-R
选项,grep 会遵循符号链接,但会检查它们并拒绝陷入循环。为了显示:
$ mkdir a
$ ln -s ../ a/b
$ grep -R something .
grep: warning: ./a/b: recursive directory loop
从以下目录中排除有问题的目录 grep -r
顺便说grep
一句,提供了一种有限的功能来阻止grep搜索某些文件或目录。例如,您可以排除所有目录命名proc
,sys
以及dev
可以从grep的递归搜索具有:
grep --exclude-dir proc --exclude-dir sys --exclude-dir dev -r something /
另外,我们可以排除proc
,sys
和,并dev
使用bash的扩展glob:
shopt -s extglob
grep -r something /!(proc|sys|dev)
grep
在/proc
其中搜索一个文件导致映射的内存,是否有可能grep
在(随机)内存中命中EOF,并将以下数据解释为要搜索的新文件名?我已经开始阅读grep
源代码,但是我想我不会在其中看到太多。