如何查找指向给定目录内任何文件/目录的所有符号链接

如何查找指向给定目录内任何文件/目录的所有符号链接

关于这个问题或者在这一个上(例如)您将获得有关如何查找指向给定目录(我们称之为/dir1)的符号链接的解决方案,而我对可能指向 内任何文件/文件夹的符号链接感兴趣/dir1

我想删除这样的目录,但我不确定这样做是否安全,因为在其他目录(我们称之为/dir2)上,我可能有指向/dir1.

此外,我可能使用绝对或相对路径创建了这些符号链接。我唯一的帮助是我知道我想要检查的符号链接位于已安装的文件系统上/dir2

答案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:在列上打印其参数raw 1 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,最好删除Nglob 限定符

答案4

根据您的情况,您可以删除该目录,然后使用以下命令删除任何生成的无效符号链接:

find -xtype l -delete

如果符号链接损坏,xtype 测试将返回“l”。

相关内容