使用 find -mount 排除到其他文件系统的符号链接

使用 find -mount 排除到其他文件系统的符号链接

我正在编写一个脚本,除其他外,它提取目录(文件和子目录)中所有项目的列表以进行存档,但它需要跳过远程符号链接(即在其他文件系统上)。该脚本是从 Solaris 迁移的,其中find . -mount似乎排除了到其他文件系统的符号链接。

查找手册页-mount

-mount Don't  descend directories on other filesystems.  An alternate name for -xdev, for compatibility with some other versions of find.

我尝试过-xdev,但这也不起作用。

由于差异,我的远程符号链接被删除。

知道如何将其修复为一行以消除返回远程符号链接吗?

答案1

Solaris 的行为存在缺陷。-mount又名-xdev并不意味着应该排除指向启动文件系统之外的符号链接:这种行为甚至没有在Solaris 文档,而其他实现则不会这样做。意思-xdev是,当find递归目录遍历到达某个挂载点时,它会完全跳过该挂载点。

我认为没有任何简单的方法可以find通过包含符号链接目标的设备来过滤匹配项。这是一个依赖于statLinux 上的实用程序(它在 Solaris 上不起作用)。

find /some/path -xdev \( ! -type l -o -exec sh -c '[ "$0" = "$(stat -L -fc %t "$1")" ]' "$(stat -fc %t /some/path)" {} \; \) -print

即打印不是符号链接的所有内容,对于符号链接,仅当目标的文件系统编号与起始点的文件系统编号匹配时才打印。悬挂的符号链接被排除并触发错误消息;添加-o -xtype lafter! -type l来包含它们,添加-xtype l -oafter-xdev来静默排除它们。

相关内容