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

前段时间,我们解释了 什么是软链接和硬链接 用实际例子。 有时您可能会忘记删除未使用的软链接或不指向任何地方的符号链接。 在文件系统上保留未使用的链接不会损害系统,除了占用一点磁盘空间。 所以没有必要保留它们。 只需找到并删除 Linux 系统上损坏的符号链接即可。

有很多方法可以在 Linux 中找到损坏的符号链接或软链接。 这里我给出了两种方法。

符号链接 是一个命令行、符号链接维护实用程序。 它扫描给定的目录并列出符号链接(如果有的话)。

符号链接可在许多 Linux 发行版的官方存储库中找到。

安装符号链接 中央操作系统, 跑:

$ sudo yum install symlinks

Fedora

$ sudo dnf install symlinks

Debian, Ubuntu, Linux 薄荷糖

$ sudo apt-get install symlinks

在 Ubuntu 上,您需要启用 [universe] 存储库。

$ sudo add-apt-repository universe

安装 Symlinks 后,运行以下命令查找并删除损坏的符号链接:

$ symlinks -dr <directory-path>

上面的命令将扫描给定目录中损坏的符号链接并删除它们。

这里,

  • d – 删除悬空的符号链接
  • r – 递归

让我给你看一个例子。 我将创建一个名为 "abc" 在当前目录中。

$ touch abc

接下来我创建一个符号链接,名为 'xyz' 为了 abc 文件:

$ ln -s abc xyz

现在删除实际文件,即 abc.

$ rm abc

您可能已经知道,一旦我们删除了实际文件,符号链接就没有任何价值。 因为它只是捷径,现在已经坏了。

要查找损坏的符号链接,请运行:

$ symlinks .

注意点 (.) 在最后。 这意味着我们正在当前目录中搜索损坏的链接。

样本输出:

dangling: /home/sk/xyz -> abc

这里, xyz 悬空是因为我们删除了实际的源文件 "abc". 所以让我们使用命令删除这个断开的链接:

$ symlinks -dr .

样本输出:

dangling: /home/sk/xyz -> abc deleted: /home/sk/xyz -> abc
使用符号链接实用程序查找和删除损坏的符号链接

最后,运行 symlinks 再次命令以确保是否有任何剩余的断开链接。

我们也可以使用 find 命令删除损坏的符号链接。

要查找损坏的符号链接,但不删除它们,请运行:

$ find . -xtype l

此命令将列出当前目录中损坏的符号链接。 例如,如果您想在特定路径上搜索损坏的符号链接 /usr/local/, 做:

$ find /usr/local/ -xtype l

输出:

使用 find 命令查找损坏的符号链接

上面的命令将搜索断开的链接 /usr/local/ 及其子目录。 正如您在上面的输出中看到的,有许多损坏的符号链接。

或者,使用以下命令列出未使用的符号链接:

$ find /usr/local/ -xtype l ! -exec test -e {} ; -print

也可以检查断开的链接指向的位置。 确保我们正在删除预期的符号链接是一个很好的做法。

$ find /usr/local/ -xtype l -exec ls -l {} +

样本输出:

lrwxrwxrwx 1 root root 28 Jan 21 08:53 /usr/local/bin/drracket -> /home/sk/racket/bin/drracket lrwxrwxrwx 1 root root 27 Jan 21 08:53 /usr/local/bin/gracket -> /home/sk/racket/bin/gracket lrwxrwxrwx 1 root root 32 Jan 21 08:53 /usr/local/bin/gracket-text -> /home/sk/racket/bin/gracket-text lrwxrwxrwx 1 root root 24 Jan 21 08:53 /usr/local/bin/mred -> /home/sk/racket/bin/mred lrwxrwxrwx 1 root root 29 Jan 21 08:53 /usr/local/bin/mred-text -> /home/sk/racket/bin/mred-text lrwxrwxrwx 1 root root 23 Jan 21 08:53 /usr/local/bin/mzc -> /home/sk/racket/bin/mzc lrwxrwxrwx 1 root root 24 Jan 21 08:53 /usr/local/bin/mzpp -> /home/sk/racket/bin/mzpp lrwxrwxrwx 1 root root 28 Jan 21 08:53 /usr/local/bin/mzscheme -> /home/sk/racket/bin/mzscheme lrwxrwxrwx 1 root root 26 Jan 21 08:53 /usr/local/bin/mztext -> /home/sk/racket/bin/mztext lrwxrwxrwx 1 root root 30 Jan 21 08:53 /usr/local/bin/pdf-slatex -> /home/sk/racket/bin/pdf-slatex lrwxrwxrwx 1 root root 29 Jan 21 08:53 /usr/local/bin/plt-games -> /home/sk/racket/bin/plt-games lrwxrwxrwx 1 root root 28 Jan 21 08:53 /usr/local/bin/plt-help -> /home/sk/racket/bin/plt-help lrwxrwxrwx 1 root root 28 Jan 21 08:53 /usr/local/bin/plt-r5rs -> /home/sk/racket/bin/plt-r5rs lrwxrwxrwx 1 root root 28 Jan 21 08:53 /usr/local/bin/plt-r6rs -> /home/sk/racket/bin/plt-r6rs lrwxrwxrwx 1 root root 34 Jan 21 08:53 /usr/local/bin/plt-web-server -> /home/sk/racket/bin/plt-web-server lrwxrwxrwx 1 root root 26 Jan 21 08:53 /usr/local/bin/racket -> /home/sk/racket/bin/racket lrwxrwxrwx 1 root root 24 Jan 21 08:53 /usr/local/bin/raco -> /home/sk/racket/bin/raco lrwxrwxrwx 1 root root 28 Jan 21 08:53 /usr/local/bin/scribble -> /home/sk/racket/bin/scribble lrwxrwxrwx 1 root root 29 Jan 21 08:53 /usr/local/bin/setup-plt -> /home/sk/racket/bin/setup-plt lrwxrwxrwx 1 root root 26 Jan 21 08:53 /usr/local/bin/slatex -> /home/sk/racket/bin/slatex lrwxrwxrwx 1 root root 29 Jan 21 08:53 /usr/local/bin/slideshow -> /home/sk/racket/bin/slideshow lrwxrwxrwx 1 root root 27 Jan 21 08:53 /usr/local/bin/swindle -> /home/sk/racket/bin/swindle

要一次删除所有损坏的链接,请运行:

$ sudo find /usr/local/ -xtype l -delete

或者,

$ sudo find /usr/local/ -xtype l ! -exec test -e {} ; -delete

代替 /usr/local/ 用你自己的路径。

建议阅读:

  • 如何在 Linux 上列出符号链接

希望能帮助到你。

CLID删除损坏的符号链接查找损坏的符号链接LinuxLinux 基础Linux 命令Linux 如何删除符号链接软链接符号链接符号链接