如何在Linux上找到损坏的符号链接并删除它们

时间:2020-03-21 11:44:23  来源:igfitidea点击:

有时我们可能会忘记删除未指向任何地方的未使用的软链接或者符号链接。
在文件系统上保留未使用的链接不会损害系统,只占用一点磁盘空间即可。
因此,没有必要保留它们。
只需找到损坏的符号链接,然后在Linux系统上将其删除即可。

查找损坏的符号链接并在Linux上将其删除

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

1.使用“符号链接”实用程序查找和删除损坏的软链接

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

在许多Linux发行版的官方存储库中都可以找到Symlinks。

要在CentOS上安装Symlinks,请运行:

$sudo yum install symlinks

在Fedora上:

$sudo dnf install symlinks

在Debian,Ubuntu和Linux Mint上:

$sudo apt-get install symlinks

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

$sudo add-apt-repository universe

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

$symlinks -dr <directory-path>

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

其中

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

让我给你看一个例子。
我将在当前目录中创建一个名为“ abc”的文件。

$touch abc

接下来,我为交流文件创建一个名为“ xyz”的符号链接:

$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”命令,以确保是否有任何剩余的断开链接。

2.使用“查找”命令查找和删除断开的软链接

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

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

$find . -xtype l

此命令将列出当前目录中损坏的符号链接。
如果要在特定路径(例如/usr/local /)上搜索损坏的符号链接,请执行以下操作:

$find /usr/local/-xtype l

输出:

上面的命令将在/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 /替换为我们自己的路径。