“查找”通过 fstype 奇怪的行为排除

“查找”通过 fstype 奇怪的行为排除

我尝试让“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

相关内容