如何在 Linux 上查找和删除损坏的符号链接

已发表: 2022-01-29
Linux 笔记本电脑上的终端窗口。
Fatmawati Achmad Zaenuri/Shutterstock

Linux 上的符号链接是一个很棒的功能,但它们可能会损坏并指向任何内容。 以下是如何找到损坏的符号链接、查看它们并在需要时将它们从系统中删除。

符号链接 101

符号链接,也称为“软链接”和“符号链接”,是一种可以指向文件和目录的快捷方式。 符号链接看起来就像文件管理器窗口中的常规文件或目录。 它还显示为终端窗口中文件列表中的一个条目。 符号链接指向的文件或目录可以位于文件系统树中的任何位置。

例如,假设您的主目录中有一个名为“dave-link”的符号链接,它指向位于文件系统树中其他位置的名为“text-file.txt”的文件。 您在符号链接上使用的命令会自动应用于它指向的文件。 如果您尝试在符号链接上使用catless ,您实际上会看到“text-file.txt”文件的内容。

标准的 Linux 安装包含许多符号链接。 即使您自己不创建任何内容,操作系统也会使用它们。 应用程序安装例程通常使用符号链接指向可执行文件。 软件更新时,二进制文件被新版本替换,所有符号链接都照常工作,只要新文件名与旧文件名相同。

我们可以通过在根目录中使用ls轻松查看一些符号链接。 一些条目以不同的颜色显示——在我们的 Ubuntu 20.10 测试机器上,它们以浅蓝色显示。

我们输入以下内容:

 ls / 

广告

我们可以使用-l (长列表)选项进行更深入的研究。 我们键入以下命令来查看所有“lib”条目和单个“bin”条目:

 ls -l /lib* /bin 

每行的开头是一个“l”,表示该项目是一个符号链接。 “->”之后的文本显示符号链接指向的内容。 在我们的示例中,目标都是目录。

权限被列为所有者、组和其他人的读取、写入和执行。 这些是默认的虚假条目。 它们不反映符号链接指向的对象的实际权限。 文件系统优先考虑目标文件或目录的权限。

损坏的符号链接

当符号链接指向的文件被删除或移动到另一个位置时,符号链接会被破坏(或悬空)。 如果应用程序的卸载例程无法正常运行,或者在完成之前被中断,则可能会留下损坏的符号链接。

如果有人在不知道符号链接指向它的情况下手动删除文件,则这些符号链接将不再起作用。 它们就像路标一样指向一个被推土机推平的城镇。

我们可以使用当前目录中名为“hello”的符号链接轻松查看此行为。 我们输入以下内容,使用ls来查看:

 ls -l
广告

它指向名为“bin”的目录中名为“htg”的程序。 如果我们“运行”符号链接,它会为我们执行程序:

 。/你好

我们现在可以通过直接运行程序来检查是否发生了这种情况:

 ../bin/htg

正如预期的那样,我们得到了相同的响应。 让我们删除程序文件:

 rm ../bin/htg

现在,当我们查看符号链接时,我们看到它以红色列出,因为 Linux 知道它已损坏。 它还告诉我们它曾经指向的位置,因此我们可以替换文件、重新编译程序或执行任何必要的操作来修复符号链接。

请注意,如果我们尝试运行符号链接,我们得到的错误引用符号链接名称,而不是符号链接指向的程序的名称。

我们输入以下内容:

 。/你好

查找损坏的符号链接

大多数现代版本的find都有xtype (扩展类型)选项,它简化了查找损坏的符号链接的过程。 我们将l标志与xtype一起使用,告诉它搜索链接。 使用findxtype如下,没有任何其他type标志,强制xtype返回断开的链接:

 寻找 。 -xtype l 

在我们的测试主目录中运行命令会发现很多损坏的符号链接。 请注意,默认情况下搜索是递归的,因此它会自动搜索所有子目录。

正如我们所料,我们故意破坏的“hello”符号链接已列出。 其他符号链接之一与 Firefox 浏览器相关,其余符号链接与快照相关联。

如果我们使用-l (lines) 选项通过wc管道输出,我们可以计算行数,这与计算损坏的符号链接相同。

我们输入以下内容:

 寻找 。 -xtype l | wc -l 

我们被告知我们有 24 个损坏的符号链接指向任何内容。

查找、查看然后删除

在您急于删除所有损坏的符号链接之前,请查看find命令的结果。 查看是否有任何损坏的符号链接的正当理由。

有时,符号链接可能是问题所在,而不是目标文件。 如果符号链接创建不正确,它可能什么都没有,但真正的目标是存在的。 在这种情况下,重新创建符号链接将是解决方法。

一个明显损坏的符号链接也有可能被用作其他东西,例如文件锁定的指示器或其他 go/no go 指示器。 Firefox 这样做; 这就是我们列表中的第一个符号链接。 但是,我们的测试机器上没有使用 Firefox,因此我们可以安全地删除它。

广告

也有可能目标只是定期出现,这是该特定软件的预期(和期望)行为。 也许目标文件是从另一台机器或云端复制的,它执行它的功能,然后再次删除,只是在下一个周期被不同的程序替换。

损坏的符号链接也可能是软件安装失败的症状。 在这种情况下,您应该手动修复它或重复安装,而不是删除符号链接。

修复需要保留的断开链接后,重复该命令以执行搜索。 然后,搜索结果中应该不存在固定的符号链接。

为了安全起见,最好将您的符号链接删除限制在您自己的目录中。 在以 root 身份或在系统目录上运行这些命令时要格外小心。

删除损坏的符号链接

-exec (执行)选项在find搜索结果上运行命令。 我们将使用rm删除每个损坏的符号链接。 {}字符串被替换为每个损坏的符号链接的名称,因为每个符号链接都是由find的。

我们必须使用分号 ( ; ) 来终止我们希望-exec运行的命令列表。 我们将使用反斜杠 ( \ ) 来“转义”分号,因此它被视为find命令的一部分,而不是Bash应该执行的操作。

我们输入以下内容:

 寻找 。 -xtype l -exec rm {} \; 

广告

我们返回到命令提示符,没有任何迹象表明发生了任何事情。 为了验证损坏的链接是否已被删除,我们重复该命令来查找它们,如下所示:

 寻找 。 -xtype l 

没有任何匹配的结果,这意味着损坏的符号链接已被删除。

记得先复习

同样,在运行命令删除符号链接之前,请务必花时间查看符号链接列表。 您可以通过运行命令在适当的目录中删除它们来避免删除任何不确定的内容。

例如,在上面,我们可以在“.snap”目录中运行命令,然后手动删除单独的“hello”符号链接。 这将使 Firefox 锁定符号链接保持不变。