我正在编写一个脚本,除其他外,它提取目录(文件和子目录)中所有项目的列表以进行存档,但它需要跳过远程符号链接(即在其他文件系统上)。该脚本是从 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
通过包含符号链接目标的设备来过滤匹配项。这是一个依赖于stat
Linux 上的实用程序(它在 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 l
after! -type l
来包含它们,添加-xtype l -o
after-xdev
来静默排除它们。