如何删除符号链接
1. 概述
创建符号链接 可以让我们更灵活地访问文件,即使目标文件位于不同的文件系统中。 在本教程中,我们将了解如何删除符号链接。
2. 问题介绍
假设我们在当前工作目录下有一个aDir 目录和一个*aFile.txt文件。*此外,我们创建了两个指向文件和目录的符号链接:
$ 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
我们的目标是删除这两个软链接。
有几种方法可以实现这一目标。接下来,让我们详细看看它们。
3. 使用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/
如上面的输出所示,我们已经成功删除了* fileLink*。删除符号链接和删除文件的语法是一样的。
接下来,让我们删除 dirLink链接:
$ rm dirLink/
rm: cannot remove 'dirLink/': Is a directory
哎呀!rm命令拒绝删除链接并打印错误消息。该消息看起来很奇怪,因为我们根本没有dirLink目录。命令有什么问题?
问题是,我们在链接名称后添加了一个正斜杠。
*当我们尝试使用rm命令删除符号链接时,我们应该将链接名称传递给*rm。无论目标是文件还是目录,我们都不应该包含斜杠。
现在我们了解了问题的原因,让我们修复它并再次尝试该命令:
$ 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 链接现已删除。
4. 使用unlink命令
unlink 命令是CoreUtils 包的 成员,它适用于所有 Linux 发行版。
让我们重新创建这两个链接并尝试使用unlink命令删除它们。
首先,我们要删除 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
同样,如果我们传递一个以斜杠结尾的名称,unlink命令也拒绝删除链接。
因此,我们应该只将链接名称传递给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
值得一提的是,如果我们将常规文件的名称传递给unlink命令,它会删除该文件,即使它不是链接:
$ 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/
5. 一次性删除多个链接
我们知道我们可以使用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 directories, 5 files
上面的输出显示我们在当前目录和子目录*“aDir”*中有多个链接。此外,一些链接名称采用“2bDeleted*”模式,而其他链接名称采用“ keepMe* ”模式。
我们的目标是递归删除名称与模式“ 2bDeleted* ”匹配的所有符号链接。
我们应该小心,我们只想删除符号链接。例如,我们应该保持常规文件2bDeleted_I_am_not_a_link.txt完整,即使它的名称以“ 2bDeleted ”开头。
接下来,让我们看看我们如何使用 find | xargs rm 来实现目标。
第一步是构建 find命令来定位我们要删除的所有链接:
$ 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 directories, 3 files
正如tree 输出所示,该命令按我们预期的方式工作。