删除一个指向目录的符号链接

1191
我有一个指向重要目录的符号链接。我想要摆脱这个符号链接,同时保留它背后的目录。
我尝试了`rm`命令,结果得到了`rm: cannot remove 'foo'`的提示。 我尝试了`rmdir`命令,结果得到了`rmdir: failed to remove 'foo': Directory not empty`的提示。 然后我继续尝试了`rm -f`、`rm -rf`和`sudo rm -rf`命令。
接着我去找我的备份文件。
有没有办法在不丢弃重要文件的情况下摆脱这个符号链接呢?

87
问与 Linux 相关的问题有什么问题吗?据我上次查看,Stack Overflow 并非特定于操作系统。 - Jeremy Cantrell
6
这个问题适合发到Super User或者Linux相关的Stack Exchange网站上,你觉得呢? - mwfearnley
53
@ mwfearnley,如果检查日期就好了。当时Super User还不存在。它已经移植过来了,所以也在那里。不确定为什么它仍然存在,但这是我得分最高的问题,我不会怀疑它所带来的积分。 - Matthew Scouten
22
“TIP:” rm -r link/会删除目标上的内容。 - Gayan Weerakutti
50
然后我去找我的备份文件 - 这让我轻笑了一下。 - Frak
显示剩余6条评论
12个回答

1447
# this works:
rm foo
# versus this, which doesn't:
rm foo/

基本上,你需要告诉它删除一个文件,而不是删除一个目录。我相信rmrmdir之间的区别存在于C库处理每个命令的方式上。

无论如何,第一个应该可以工作,而第二个应该会抱怨foo是一个目录。

如果上述方法不起作用,则请检查您的权限。您需要对包含文件的目录具有写入权限才能删除文件。


137
啊,这很有道理。我从来没有打过"foo",我输入了"f<tab>",然后bash为我填写了一个斜杠"/"。 - Matthew Scouten
6
有时候这不起作用。偶尔需要运行rm -rf 文件夹名称(末尾没有/)以删除符号链接。例如,在某些情况下,Amazon Linux就是这样的行为。 - brandonscript
23
@r3mus说:“永远不要在符号链接上使用-r,除非你想丢失其中的所有内容。 -f 也不应该需要,除非你想覆盖文件权限。” - Matthew Scharley
31
具体而言,unlinkln操作(即“link”)无关。unlink名称指的是从文件系统的文件表中取消链接/删除文件的过程,使内容与任何对它们的引用分离 - 它们被取消链接。这是一个令人困惑的名称,特别是当应用于链接和符号链接时,会产生误导。unlink将适用于符号链接,因为它适用于任何类型的文件 - Matthew Scharley
5
如果你真的担心会做一些傻事,我认为alias rm="rm -i"比其他任何东西都更能保护你。请注意,这是一个命令行语句。 - Matthew Scharley
显示剩余6条评论

863
使用unlink命令,并确保不要在末尾加上/。
unlink mySymLink
unlink()从文件系统中删除一个名称。如果该名称是文件的最后一个链接,并且没有进程打开该文件,则该文件将被删除,并且其使用的空间将可供重用。
如果该名称是文件的最后一个链接,但仍有任何进程打开该文件,则该文件将保留存在,直到最后一个引用它的文件描述符关闭为止。
我认为如果我理解正确的话,这可能会有问题。
如果该名称是符号链接的引用,则链接将被删除。
如果该名称是套接字、FIFO或设备的引用,则该名称将被删除,但仍然打开该对象的进程可能继续使用它。

36
@OmarAbid的"rm foo/"版本让我有点害怕。这个版本看起来更安全 :) - Joe Phillips
9
在Ubuntu上,我用~/c/a/file/c/b/进行了测试,并使用ln -s ~/c/a ~/c/b/创建了软链接。在~/c/b/目录中,rm a/无法正常工作,rm -rf a/只会清空原始的a文件夹。unlink a可以正常工作,而unlink a/则不起作用。 - Brady Trainor
4
在OS X 10.10中,“unlink”只是“rm”的别名。这说明当处理您的目录结构时,应该使用适当的“rm”操作方法。 - Doug Powers
1
在脚本中,rm -f 会静默地删除一个链接,无论它是否存在,而 unlink 如果链接不存在则会报错。对于 unlink,没有 -f 选项等效的功能,这使得脚本更加复杂。 - shonky linux user
25
unlink 命令可以删除普通文件,它的功能比 rm 更少,但它不专门用于符号链接。rm 命令也不能删除目录,除非加上 -r 标志。因此我建议更喜欢使用 rm 命令,它有详细和交互标志,并且可以提供有意义的警告和错误消息。 - ThorSummoner
显示剩余5条评论

21

rm 应该删除符号链接。

$ cd ~
$ mkdir bar
$ ln -s bar foo
$ ls -l foo
lrwxrwxrwx 1 skrall skrall 3 2008-10-16 16:22 foo -> bar

$ rm foo
$ ls -l foo
ls: cannot access foo: No such file or directory

$ ls -l bar
total 0

19

使用rm symlinkname命令来删除符号链接,但不要在末尾加上斜杠(不要使用:rm symlinkname/)。然后会询问是否要删除符号链接,输入y回答是。


64
你说的没错,但正确答案早已存在并被接受(四年前!)。为何还要费心呢? - Matthew Scouten
2
谷歌在搜索“删除符号链接”时将此作为推荐片段。也许它喜欢它的简洁性,不确定其启发式工作方式。无论如何,当我回顾我的命令行时,我立刻扇了自己一个耳光。 - Randall

15
过时的答案。在2008年至2023年之间,rm -d已被移除。
假设它实际上是一个符号链接,
$ rm -d symlink

它应该能够解决这个问题,但由于无法做到,我们启用了原本用于其他情况的潜在代码,尽管那种情况已经不存在,但在这里却能够达到正确的效果。

1
在CentOS 6.8,Coreutil 8.4(2018年6月发布)中不存在“-d”参数,但在Xubuntu 18.04,Coreutils 8.28(2018年1月发布)中存在该参数... - karatedog
它是在哪个系统上进行测试的?使用了哪个shell(如果相关的话)? - undefined

8
如果rm无法删除符号链接,可能需要查看包含符号链接的目录权限。要删除目录条目,您需要对包含目录具有写权限。

5
假设您的设置类似于:ln -s /mnt/bar ~/foo,那么您应该可以毫无问题地执行rm foo。如果不能,请确保您是foo的所有者,并且有写/执行文件的权限。除非您递归删除,否则删除foo不会影响bar

5

我之前也遇到了同样的问题。建议尝试使用unlink <绝对路径>

例如unlink ~/<用户>/<其他目录>/foo


1
如果问题中包含特定名称(foo),你的答案不应该使用类似“〜/ <USER> / <SOME OTHER DIRECTORY> / foo”这样令人困惑的东西。此外,一些解释会很有帮助。 - U. Windl

3
在CentOS上,只需运行rm linkname,它会询问“删除符号链接?”。键入YEnter,链接将被删除,目录将保持安全。

3

我在Windows Server上使用MinGW(实际上是Git Bash)时遇到了这个问题。上面的建议似乎都没有起作用。最后,我为了备份复制了该目录,然后在Windows资源管理器中删除了软链接,接着将其从回收站中删除。它发出了删除文件的声音,但实际上并没有删除。记得备份!


3
“它发出了删除文件的声音…” - 哇! - Sterex
LMFAO。"它发出了像是在删除文件的声音..." - Shivam Jha
我还记得软盘! - Keith Whittingham
以上方法均无效:eddyq@eddyq-Latitude-E6440:~$ ls 桌面 下载 Dropbox-Windows 音乐 公共 视频 w 文档 Dropbox examples.desktop 图片 模板 'VmWare vmx files' - eddyq

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接