我尝试让“find”命令排除“/proc”文件系统。我更喜欢一个可移植的解决方案,能够在非基于 GNU 的主机上使用它(例如最古老的 AIX,其中“find”没有“-path”选项)
这是我尝试过的(在 Linux 主机上)和部分过滤的输出:
$ 找到 / ! -fstype 过程 >/dev/null 查找:`/proc/9475/task/9535/fdinfo/7':没有这样的文件或目录 查找:`/proc/10856':没有这样的文件或目录 查找:`/proc/10856':没有这样的文件或目录 find: `/proc/10858': 没有这样的文件或目录 find: `/proc/10858': 没有这样的文件或目录 find: `/proc/15650': 没有这样的文件或目录 find: `/proc/15650': 没有这样的文件或目录 查找:`/proc/15654':没有这样的文件或目录 查找:`/proc/15654':没有这样的文件或目录 查找:`/proc/15656':没有这样的文件或目录 查找:`/proc/15656':没有这样的文件或目录 查找:`/proc/15657':没有这样的文件或目录 查找:`/proc/15657':没有这样的文件或目录 查找:`/proc/15663':没有这样的文件或目录 ETC ....
我不明白为什么“find”在“/proc”文件系统中继续行走,尽管有“!-fstype proc”开关?
答案1
作为特登解释说,find
仍会进入该/proc
目录,但不会返回该文件系统类型的任何路径名。
proc
要在检测到文件系统类型后立即删除任何搜索路径,请使用
find / -fstype proc -prune -o -print
但是,由于您想在旧版本上执行此操作find
,因此该-fstype
选项可能不可用。如果-path
( 的标准选项find
) 也不可用,那么提出建议就会变得有点困难,因为该实现显然不符合 POSIX 标准。
一种选择可以使用-xdev
它将导致find
严格保留在与起始路径相同的文件系统中。然后,您必须find
为要检查的每个文件系统运行一个。还可能有一个名为-x
(如在 BSD 系统上)的选项,其作用类似于-xdev
.
如果这也不可能,那么您可能不得不诉诸使用-type d -name proc -prune
来忽略所有名为 的目录proc
。
答案2
该-fstype
指令告诉find
不要返回该文件系统类型上的任何结果。然而,这并不意味着它不会查看目录/proc
。它只是意味着它不会返回在proc
文件系统上找到的文件。但是,它仍然需要遍历/proc
目录,因为无法知道某个非 proc 文件系统是否已安装到/proc/something
.例如,在我的 Arch 上,我发现:
$ find /proc ! -fstype proc -printf '%p %F\n' 2>/dev/null
/proc/sys/fs/binfmt_misc binfmt_misc
/proc/sys/fs/binfmt_misc/CLR binfmt_misc
/proc/sys/fs/binfmt_misc/register binfmt_misc
/proc/sys/fs/binfmt_misc/status binfmt_misc
这是因为/proc/sys/fs/binfmt_misc/
不是 proc 文件系统:
$ mount | grep proc
proc on /proc type proc (rw,nosuid,nodev,noexec,relatime)
systemd-1 on /proc/sys/fs/binfmt_misc type autofs (rw,relatime,fd=51,pgrp=1,timeout=0,minproto=5,maxproto=5,direct,pipe_ino=12642)
binfmt_misc on /proc/sys/fs/binfmt_misc type binfmt_misc (rw,relatime)
因此有两个挂载点,/proc
其下保存非 proc 文件系统。
因此,考虑到这一点,请注意您的问题仅显示错误消息。这些文件实际上都没有被返回find
,因此它的行为似乎符合预期。它会遍历其中的文件,/proc
但如果它们位于文件系统上,则不会认为它们匹配proc
。