如何查看给定目录存在哪些符号链接?

如何查看给定目录存在哪些符号链接?

我想在目录中做一些内务处理,并且我想查看给定目录是否有任何指向的符号链接它。我可以很容易地看到符号链接指向哪个目录,但现在我想看看相反的关系。

答案1

不跟踪符号链接,因此您必须执行详尽的搜索。此外,符号链接是文本的,因此即使它们所在的文件系统被卸载,它们也会保持“现有”(如果安装在不同的位置或重命名目录,它们可能有不同的目标)。因此,您最多能做的就是找到指向特定文件(或目录)的符号链接,例如/target,在特定的目录层次结构中,例如/haystack

(请注意,我假设您确实在寻找符号链接一个特定的目录。查找符号链接指向进入目录(即该目录的文件或子目录)或跨越目录(即如果删除目录可能会变得悬空)是更困难的问题。)

使用某些版本的 find(例如,在(最近的)Linux、FreeBSD 或 Mac OS X 上),您可以轻松查找目标为以下内容的符号链接/target

find -L /haystack -xtype l -samefile /target

find在命令没有主命令的系统上-samefile,您可以使用 ksh 或 bash(如果可用)。-xtype如果也不支持则删除;那么该命令还将列出目标本身(或指向它的任何硬链接)。

find -L /haystack -xtype l -exec ksh -c '
    for x; do [[ $0 -ef $x ]] && printf "%s\n" "$x"; done
' /target {} +

仅使用 POSIX 工具执行此操作要困难得多,因为缺乏测试同文件性或获取有关符号链接的信息的 POSIX 方法。这是目录的解决方案;它假设任何文件名中都没有换行符。

find /haystack -type l -exec sh -c 'cd -P -- "$0" && pwd' {} \; |
  grep -Fx "$(cd -P /target && pwd)"

这是我的强制性 zsh 解决方案。

echo /haystack/**/*(@e\''[[ $REPLY -ef /target ]]'\')

答案2

您需要/使用搜索查找(1)以及-type l识别所有链接的选项,后跟正则表达式(1)隔离感兴趣的链接。

相关内容