如何在Linux上查找和删除损坏的符号链接
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标志来告诉它搜索链接。按如下方式使用find
和xtype
,没有其他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
没有任何匹配结果,这意味着断开的符号链接已被删除。