我想要做一些日常的目录,我想看看如果给定的目录中有任何指向符号链接到它。我可以很容易地看到符号链接指向的目录,但现在我想看到相反的关系。
符号链接不会被跟踪,因此您必须执行详尽的搜索。此外,符号链接是文本的,因此即使它们所在的文件系统被卸载,它们也会保持“存在”(如果挂载在不同的位置或重命名目录,它们可能具有不同的目标)。因此,您最多可以找到指向特定文件(或目录)的符号链接,例如/target
,在特定目录层次结构中,例如/haystack
。
(请注意,我假设你真正需要的符号链接到一个特定的目录。查找指向符号链接到一个目录下(即一个文件或目录的子目录中),或者翻过一个目录(即有可能成为,如果你删除的目录晃来晃去) 是更难的问题。)
使用某些版本的 find(例如(最近)Linux、FreeBSD 或 Mac OS X),您可以轻松查找目标为/target
:
find -L /haystack -xtype l -samefile /target
Run Code Online (Sandbox Code Playgroud)
在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 {} +
Run Code Online (Sandbox Code Playgroud)
由于缺乏 POSIX 方法来测试相同文件性或获取有关符号链接的信息,因此仅使用 POSIX 工具执行此操作要困难得多。这是目录的解决方案;它假设任何文件名中都没有换行符。
find /haystack -type l -exec sh -c 'cd -P -- "$0" && pwd' {} \; |
grep -Fx "$(cd -P /target && pwd)"
Run Code Online (Sandbox Code Playgroud)
这是我的强制性 zsh 解决方案。
echo /haystack/**/*(@e\''[[ $REPLY -ef /target ]]'\')
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
5103 次 |
最近记录: |