我想在目录中做一些内务处理,并且我想查看给定目录是否有任何指向的符号链接到它。我可以很容易地看到符号链接指向哪个目录,但现在我想看看相反的关系。
答案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 ]]'\')