符号链接(symlink)是一种特殊的文件,它指向另一个文件或目录。它的工作方式类似于快捷方式,能让你更高效地组织和访问文件。你可以使用 ln 命令创建符号链接;如果不确定该使用哪种链接类型,请参阅硬链接与符号链接的区别。
本指南介绍了如何使用 rm、unlink 和 find 命令在 Linux 中删除符号链接。
快速参考
如需可打印的快速参考,请参阅 ln 命令速查表。
| 任务 | 命令 |
|---|---|
| 删除符号链接 | rm symlink_name |
| 带确认删除 | rm -i symlink_name |
| 删除多个符号链接 | rm symlink1 symlink2 |
| 删除符号链接(unlink) | unlink symlink_name |
| 查找损坏的符号链接 | find /path -xtype l |
| 查找损坏的符号链接(跨平台) | find -L /path -type l |
| 删除损坏的符号链接 | find /path -xtype l -delete |
| 删除目录树中的全部符号链接 | find /path -type l -delete |
开始之前
要删除符号链接,你必须对包含该链接的目录拥有写权限。否则,命令会返回与权限相关的错误。
删除符号链接时,它所指向的文件或目录不会受到影响,只有链接本身被删除。
使用 ls -l 命令可以检查某个文件是否为符号链接,并查看它指向的位置:
ls -l /usr/bin/python3
lrwxrwxrwx 1 root root 10 Aug 18 2024 /usr/bin/python3 -> python3.12
第一个字符 l 表示该文件是一个符号链接。-> 符号则显示目标文件。
使用 rm 删除符号链接
rm 命令用于删除文件和目录。
要删除一个符号链接,请在 rm 后跟上符号链接的名称:
rm symlink_name
命令执行成功时不会产生任何输出,并以状态码 0 退出。
你可以通过传入多个用空格分隔的名称,一次性删除多个符号链接:
rm symlink1 symlink2
若要在删除符号链接前进行确认,可使用 -i 选项:
rm -i symlink_name
输入 y 并按 Enter 键确认:
rm: remove symbolic link 'symlink_name'?
避免尾斜杠
如果符号链接指向一个目录,请勿在链接名称后附加尾斜杠 /。否则,rm 会将其当作目录处理并返回错误:
rm symlink_to_dir/
rm: cannot remove 'symlink_to_dir/': Is a directory
出现这种情况是因为:在未使用 -d 或 -r 选项时,rm 无法删除目录。
一旦你加上 -r 或 -f,尾斜杠就会变得危险。以 / 结尾的路径名会强制其前面的名称解析为目录,于是 rm 会跟随链接、对目标(而非链接本身)进行操作:
rm -rf symlink_to_dir/
该命令会删除目标目录内部的文件,而把符号链接留在原地(此时它已成为悬空链接)。去掉斜杠可使 rm -rf symlink_to_dir 变得安全,因为它只删除链接本身;但更值得养成的习惯更简单:永远不要在符号链接名称后输入尾斜杠。
使用 unlink 删除符号链接
unlink 命令用于删除单个文件。与 rm 不同,它只接受一个参数。
要使用 unlink 删除符号链接,请将符号链接名称作为参数传入:
unlink symlink_name
命令执行成功时不会产生任何输出。
请勿在符号链接名称后附加尾斜杠 /,因为 unlink 无法删除目录。
查找并删除损坏的符号链接
如果你删除或移动了目标文件,符号链接就会变成悬空(损坏)状态,不再可用。
要在指定目录下查找所有损坏的符号链接,请运行以下命令:
find /path/to/directory -xtype l
/path/to/directory/symlink1 /path/to/directory/subdir/symlink2
-xtype l 测试匹配「目标不存在」的符号链接。
-xtype 测试属于 GNU 版 find,Ubuntu、Debian、Fedora 和 RHEL 自带的都是它。在配备 BSD 版 find 的系统(如 macOS)上,应改用 -L 选项。它会让 find 跟随符号链接,因此正常的链接会被报告为它所指向的对象,只有损坏的链接仍匹配 -type l:
find -L /path/to/directory -type l
GNU 版 find 也接受这种写法,这使它成为「需要在多台系统上运行」的脚本中更稳妥的选择。
若要将搜索限制在当前目录层级、不进入子目录,可向 find 传入 -maxdepth 1 选项:
find /path/to/directory -maxdepth 1 -xtype l
/path/to/directory/symlink1
一旦你找到了这些损坏的符号链接,可以手动用 rm 或 unlink 删除它们,也可以使用 find 的 -delete 选项一次性全部删除:
find /path/to/directory -xtype l -delete
删除目录中的所有符号链接
有时你需要清空某个目录下的所有符号链接,而不只是损坏的那些。此时去掉测试中的 x,让 find 无论链接目标是否仍然存在都进行匹配,并在删除任何内容之前先列出它们:
find /path/to/directory -type l
/path/to/directory/symlink1 /path/to/directory/config_link /path/to/directory/subdir/symlink2
当列表与预期一致后,在同一条命令中加入 -delete:
find /path/to/directory -type l -delete
这些链接所指向的文件和目录不会被触动。-delete 会删除每个链接的目录项而不跟随它,因此只有链接本身消失。
故障排查
rm: cannot remove 'symlink/': Is a directory:你在一个指向目录的符号链接后附加了尾斜杠 /。请去掉斜杠:rm symlink。切勿使用 rm -rf symlink/,因为它可能跟随链接并删除目标目录的内容。
rm: cannot remove 'symlink': No such file or directory:该路径下不存在此符号链接,或者你所处的目录不对。请用 ls -l symlink 验证,必要时使用绝对路径。
unlink: cannot unlink 'symlink': Operation not permitted:你对父目录没有写权限。请用 ls -ld . 检查归属;只有当父目录属于系统时,才在命令前加 sudo 重新运行。
常见问题
删除符号链接会删除原始文件吗? 不会。删除符号链接只会删除链接本身,它所指向的原始文件或目录会保持完好。
如何判断某个文件是否为符号链接? 运行 ls -l 文件名。如果权限字符串的第一个字符是 l,该文件就是符号链接。输出还会在 -> 箭头后显示目标。
当目标被删除时,符号链接会怎样? 符号链接会变成悬空(损坏)链接。它仍存在于磁盘上,但任何访问它的尝试都会以「No such file or directory」错误失败。可使用 find /path -xtype l 来定位损坏的符号链接。
rm 与 unlink 在删除符号链接时有何区别? 两条命令删除符号链接的方式相同。主要区别在于 unlink 只接受单个参数,而 rm 可以一次删除多个文件,并支持诸如 -i(交互确认)之类的选项。
总结
要删除符号链接,请使用 rm 或 unlink,后跟符号链接名称。删除指向目录的符号链接时,请勿附加尾斜杠。当你在移动或删除目标文件后需要清理损坏的链接时,可使用 find /path -xtype l。