如何在 Linux 中删除符号链接文件?
概述
符号链接允许我们更轻松地访问文件,即使它们位于不同的位置。在本教程中,我们将学习如何从系统中删除符号链接并将其替换为原始文件。
问题
假设我们有一个 aDir 文件夹和一个 aFile.text 文件位于我们的当前工作目录下。我们还创建了两个指向该文件夹和子文件夹的符号链接文件:
$ ls -l total 0 drwxr-xr-x 2 kent kent 40 Apr 26 23:48 aDir/ -rw-r--r-- 1 kent kent 0 Apr 26 23:46 aFile.txt lrwxrwxrwx 1 kent kent 4 Apr 26 23:48 dirLink -> aDir/ lrwxrwxrwx 1 kent kent 9 Apr 26 23:48 fileLink -> aFile.txt
我们希望删除这两个软链接文件。
您可以使用几种不同的方法来实现这一点。
使用 rm 命令
rm(删除)命令可以删除文件和文件夹。我们可以使用此命令删除符号链接。
首先,让我们使用 'rm'(删除)命令删除 fileLink。
$ rm fileLink $ ls -l total 0 drwxr-xr-x 2 kent kent 40 Apr 26 23:48 aDir/ -rw-r--r-- 1 kent kent 0 Apr 26 23:46 aFile.txt lrwxrwxrwx 1 kent kent 4 Apr 26 23:48 dirLink -> aDir/
如上所示,我们已成功删除了名为 Link 的符号链接。删除符号链接及其目标的语法相同。
接下来,尝试删除 dirLink 链接:
$ rm dirLink/ rm: cannot remove 'dirLink/': Is a directory
rmdir 命令拒绝删除目录,而是打印错误消息。该消息看起来不正确,因为我们没有 dirLink 目录。命令哪里出错了?
我们在链接名称后添加了一个正斜杠。
在尝试使用 rm 命令删除符号链接时,我们应该使用 -f 选项。无论目标是文件、目录还是两者兼而有之,我们都不应添加 / 字符。
在了解问题发生的原因后,现在让我们修复它,看看问题是否已解决。
$ rm dirLink $ ls -l total 0 drwxr-xr-x 2 kent kent 40 Apr 26 23:48 aDir/ -rw-r--r-- 1 kent kent 0 Apr 26 23:46 aFile.txt
太好了!dirlink 链接现已删除。
使用 unlink 命令
unlink 命令属于 CoreUtils 包,在所有 Linux 发行版上都可用。
让我们重新创建这两个链接,看看是否可以使用 unlinked 命令删除它们。
我们首先要删除 fileLink 链接。
$ unlink fileLink $ ls -l total 0 drwxr-xr-x 2 kent kent 40 Apr 26 23:48 aDir/ -rw-r--r-- 1 kent kent 0 Apr 26 23:46 aFile.txt lrwxrwxrwx 1 kent kent 4 Apr 27 00:15 dirLink -> aDir/
它非常易于使用,并且有效。
现在,我们将 dirLink/ 传递给 unlink 以查看它是否可以删除该链接。
$ unlink dirLink/ unlink: cannot unlink 'dirLink/': Not a directory
如果我们传递一个包含尾部斜杠的 URL,则 unlinked 命令也不会删除该链接。
因此,我们应该只将链接名称传递给 unlink:
$ unlink dirLink $ ls -l total 0 drwxr-xr-x 2 kent kent 40 Apr 26 23:48 aDir/ -rw-r--r-- 1 kent kent 0 Apr 26 23:46 aFile.txt
如果我们将普通文件的名称传递给 unlinked 命令,它将删除该文件,即使它不是链接文件。
$ unlink aFile.txt $ ls -l total 0 drwxr-xr-x 3 kent kent 60 Apr 27 00:22 ./ drwxrwxrwt 23 root root 840 Apr 27 00:18 ../ drwxr-xr-x 2 kent kent 40 Apr 26 23:48 aDir/
一次删除多个链接
我们可以使用 find | xargs rm 组合删除 find 命令结果中的文件。我们可以按照相同的步骤删除符号链接。
现在,我们来看另一个例子:
$ tree . ├── 2bDeleted_01.txt -> aFile.txt ├── 2bDeletedDir -> aDir ├── 2bDeletedDir_01 -> aDir ├── 2bDeletedDir_02 -> aDir ├── 2bDeleted_I_am_not_a_link.txt ├── 2bDeleted.txt -> aFile.txt ├── aDir │ ├── 2bDeleted_etc -> /etc │ └── keepMe_etc -> /etc ├── aFile.txt ├── keepMeDir -> aDir └── keepMe.txt -> aFile.txt
7 个目录,5 个文件
上面的输出表明,我们的当前目录和子目录中有多个链接。一些链接的名称为 2BDeleted*,而另一些链接的名称为 keepMe*。
我们希望删除所有名称与正则表达式 "2bDeleted*" 匹配的符号链接。
我们应该小心不要删除任何符号链接。例如,如果我们想保持 2BDeleted_I_Am_Not_A_Link.txt 正则文件完整,那么我们不应该删除名为 2BDeleted_ 的文件。
接下来,请参阅我们如何使用 find | xargs rm(或 unlink)组合删除链接文件。
我们需要做的第一件事是编写一个命令来查找我们要从站点中删除的所有 URL。
$ find . -type l -name '2bDeleted*' ./2bDeleted.txt ./2bDeleted_01.txt ./2bDeletedDir ./2bDeletedDir_01 ./2bDeletedDir_02 ./aDir/2bDeleted_etc
我们向 find 函数传递两个参数:
type l - 用于仅搜索符号链接文件
name ‘2bDeleted*’ - 链接名称与给定模式匹配
接下来,我们可以将输出管道传输到 xargs 命令:
$ find . -type l -name '2bDeleted*' | xargs -I{} rm "{}" $ tree . ├── 2bDeleted_I_am_not_a_link.txt ├── aDir │ └── keepMe_etc -> /etc ├── aFile.txt ├── keepMeDir -> aDir └── keepMe.txt -> aFile.txt
3 个目录,3 个文件
如树形图所示,该命令按预期工作。
结论
我们已经了解到,当我们想要删除符号链接时,可以使用 rm 或 unlink 命令。
但是,我们应该记住,无论我们使用什么命令,都应该始终传递链接名称,而不包括尾部正斜杠。
我们还讨论了如何使用示例一次从多个目录中删除符号链接。