答案1
您可以使用以下命令找到所有符号链接:
find / -type l
您可能需要以 root 身份运行它,以便到达光盘上的每个位置。
您可以扩展这些来readlink -f
获取链接的完整路径,并且您应该能够grep
针对您正在考虑删除的目标目录进行输出:
find / -type l -exec readlink -f {} + | grep -F /dir2
使用find / -type l -printf '%l\n'
不起作用,因为您获得的相对链接../tmp/xyz
可能指向您的目标目录,但由于它们未完全展开而不匹配。
答案2
就我而言,接受的答案没有用(因为它没有输出链接源)。这对我有用。
我使用两个子句解决了这个问题-exec
:
find /home/ -type l -exec readlink -nf {} ';' -exec echo " <- {}" ';' | grep "/dir2"
答案3
和zsh
:
print -rC1 /dir2/**/*(ND@e['[[ $REPLY:P = /dir1(/*|) ]]'])
细分:
print -rC1
:在列上打印其参数r
aw1
C
。在这里,参数将是从以下 glob 生成的参数。替换为ls -ld
以获取有关每个符号链接的更多信息**/
:任何级别的子目录(递归通配)*
:具有任意名称的文件(由任意数量的字符组成,尽管 zsh 与*
大多数 shell 一样也允许非字符)。(...)
:glob 限定符进一步限定其他条件的匹配,而不仅仅是文件名N
:启用nullglob
该 glob(如果没有匹配则不会失败,只需传递一个空列表即可,print
该列表不会打印任何内容)。D
: 启用dotglob
: 还考虑隐藏文件。@
:限制文件类型符号链接。e['code']
:选择评估结果为 true 的文件code
。在 内code
,正在考虑的文件存储在$REPLY
.$REPLY:P
:获取文件的绝对和规范(无符号链接)路径(类似于realpath()
标准函数的作用)。[[ string = pattern ]]
如果字符串与模式(来自 ksh)匹配,则返回 true。/dir1(/*|)
作为模式/dir1
单独匹配或/dir1/
后跟任何内容。
¹ 需要注意的是,如果没有匹配的文件,则会列出当前工作目录。对于ls
,最好删除N
glob 限定符
答案4
根据您的情况,您可以删除该目录,然后使用以下命令删除任何生成的无效符号链接:
find -xtype l -delete
如果符号链接损坏,xtype 测试将返回“l”。