有些目录可能会导致查找问题,尤其是find /
.这些是操作系统在其中创建文件的目录,但这些文件并不是真正的文件。这些目录中有/proc
/sys
/run
.
问题是,如果你正在做类似的事情find / -exec grep
,如果你爬取其中一些系统,你可能会把系统搞得一团糟。
那么我如何告诉 find 跳过这些目录而不列出它们。因为有人可能决定创建一个像这样的新目录。与其依赖列表,我宁愿对目录进行测试,并选择排除未通过此测试的目录。
答案1
好的,您不想依赖排除文件的列表,因此您不必冒险排除太少的目录。
因此,让我们依靠说明要包含哪些文件。
这些“不是真正的文件”几乎都位于单独的文件系统上。
这更像是“不是真正的文件系统”,只是看起来很相似。
我们可以说的是,它们不在我们的“真实”文件系统上。
假设我们有两个分区,安装在/
和 `/home' 中:
有了选项-xdev
,我们就可以find
在这些已知的好地方运行,而不是别的:
find / /home -xdev -exec grep ...
一些奇怪的文件仍然可能混入我们的正常文件中(参见上面的“几乎全部”)。
它们确实会引起问题:如果有一个被遗忘的fifo
文件,并且您对它运行 grep ,您的 grep 会尝试读取它并永远等待。
我们可以排除所有危险类型,但看看 的可能文件类型-type
,我们真正需要的文件类型并不多:f
、d
和l
符号链接。
我们只需要注意包含部分或全部键入的f
, d
and l
,或排除b
, c
, p
, s
and D
。
find / /home -xdev -type f -exec grep ...
或者如果我们想包含符号链接:
find /home/me/dirWithSomeLinksToFiles -xdev \( -type f -or -type d \) -exec grep ...
答案2
不用担心目录,为什么不告诉 find 只将实际文件提供给 grep 呢?
find / -type f -exec grep .... {} +
似乎对我来说工作得很好(grepping kmem 不会杀死盒子;D)。