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

时间:2020-01-09 10:39:11  来源:igfitidea点击:

Linux上的符号链接是一个很棒的功能,但是它们可能会断开并指向无处。这是查找,断开符号链接并在需要时将其从系统中删除的方法。

符号链接

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

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

标准Linux安装包含许多符号链接。即使我们自己不创建任何文件,操作系统也会使用它们。应用程序安装例程通常使用符号链接指向可执行文件。更新软件后,二进制文件将替换为新版本,并且只要新文件的名称与旧文件名相同,所有符号链接都将像以前一样继续工作。

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

我们输入以下内容:

ls /

我们可以通过使用-l(长列表)选项来更深入地了解。我们键入以下命令来查看所有lib条目和单个bin条目:

ls -l /lib* /bin

每行的开头是l,表示该项目是符号链接。 ->之后的文本显示符号链接指向的位置。在我们的示例中,目标是所有目录。

所有者,组和其他人的权限被列为读,写和执行。这些是默认的伪造条目。它们没有反映符号链接指向的对象的实际权限。目标文件或者目录上的权限具有优先权,并由文件系统接受。

链接断开

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

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

我们可以在当前目录中使用名为hello的符号链接轻松看到此行为。我们使用ls键入以下内容:

ls -l

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

./hello

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

../bin/igidea

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

rm ../bin/igidea

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

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

我们输入以下内容:

./hello

查找断开的符号链接

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

find . -xtype l

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

正如我们预期的那样,列出了我们故意破坏的hello符号链接。其他符号链接之一与Firefox浏览器有关,其余符号链接与快照相关联。

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

我们输入以下内容:

find . -xtype l | wc -l

我们获悉,我们有24个断开的符号链接,指向什么都没有。

查找,查看,然后删除

在匆忙删除所有损坏的符号链接之前,请仔细查看find命令的结果。查看是否有任何断开符号链接的正当理由。

有时,符号链接可能是问题所在,而不是目标文件。如果符号链接创建不正确,则可能指向无内容,但存在实际目标。在这种情况下,重新创建符号链接将是解决方案。

还有可能是一个看起来已损坏的符号链接被用作其他东西,例如文件锁定指示符或者其他执行/不执行指示符。 Firefox做到了;这就是我们列表中的第一个符号链接。但是,我们的测试机上未使用Firefox,因此我们可以安全地删除它。

目标也可能仅定期出现,这是该特定软件的预期(和期望)行为。也许目标文件是从另一台计算机或者云中复制的,它执行了其功能,然后又被删除了,只是在下一个周期中被另一个程序替换。

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

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

为了安全起见,最好将符号链接删除限制在自己的目录中。要特别小心以root用户或者在系统目录上运行这些命令。

删除断开的符号链接

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

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

我们输入以下内容:

find . -xtype l -exec rm {} \;

我们返回到命令提示符,没有任何提示。要验证断开的链接是否已被删除,我们重复命令以查找它们,如下所示:

find . -xtype l

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