删除目录的符号链接

Mat*_*ten 1063 linux symlink file

我有一个重要目录的符号链接.我想摆脱那个符号链接,同时保持它背后的目录.

我试着rm回去rm: cannot remove 'foo'.
我试着rmdir然后回来rmdir: failed to remove 'foo': Directory not empty
然后继续前进rm -f,rm -rf然后sudo rm -rf

然后我去寻找我的备份.

有没有办法摆脱符号链接,而不是用洗澡水扔掉婴儿?

Mat*_*ley 1282

# this works
rm foo
# versus
rm foo/
Run Code Online (Sandbox Code Playgroud)

基本上,您需要告诉它删除文件,而不是删除目录.我认为由于C库对待每个库的方式不同rmrmdir存在差异和存在.

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

如果它不能如上所述,那么检查您的权限.您需要对包含目录的写入权限才能删除文件.

  • 没错.那讲得通.我从来没有输入过foo,我输入了f <tab>和bash填入了/为我. (113认同)
  • unlink命令更好.`unlink theSymLink` (71认同)
  • 具体来说,`unlink`与`ln`AKA'链接'操作无关.名称"unlink"指的是从文件系统的文件表中取消链接/删除文件的过程,以便内容与对它们的任何引用分离 - 它们是未链接的.当应用于链接和符号链接时,这是一个令人困惑的名称,这是完全误导的.`unlink`将与符号链接一起使用,因为它适用于**任何文件**,无论类型如何. (25认同)
  • @ r3mus:永远不要在符号链接中使用`-r`,除非你想丢失其中的所有内容.除了覆盖文件权限之外,也不需要`-f`. (17认同)
  • 这并不总是有效.有时你需要运行`rm -rf folderName`(没有尾随/)才能删除符号链接.例如,Amazon Linux在某些情况下会以这种方式运行. (6认同)
  • 如果你真的担心做一些愚蠢的事情,`alias rm ="rm -i"`比我想的其他任何东西都节省了更多的皮. (4认同)
  • @fxfilmxf`unlink`可能在`rm`所在的某些平台上不可用. (2认同)

Joe*_*ips 828

使用"unlink"命令并确保不在最后使用/

$ unlink mySymLink
Run Code Online (Sandbox Code Playgroud)

unlink()从文件系统中删除名称.如果该名称是文件的最后一个链接,并且没有进程打开该文件,则该文件将被删除,并且其使用的空间可供重用. 如果名称是文件的最后一个链接,但任何进程仍然打开文件,则文件将保持存在,直到引用它的最后一个文件描述符关闭为止.

我认为如果我正确阅读它可能会有问题.

如果名称引用符号链接,则删除该链接.

如果名称引用套接字,fifo或设备,则删除其名称,但打开该对象的进程可以继续使用它.

https://linux.die.net/man/2/unlink

  • @OmarAbid"rm foo /"版本让我害怕.这个看起来更安全:) (31认同)
  • `unlink`可以删除常规文件.它比`rm`更不具备特色,而且不是特定于符号链接的.`rm`也不删除没有`-r`标志的目录.所以我建议更喜欢rm,它有详细和交互的标志; 以及有意义的警告和错误消息. (21认同)
  • 在Ubuntu中,我使用`〜/ c/a/file`,`/ c/b /`和`ln -s~/c/a~/c/b /`进行了测试.在`〜/ c/b /`中,`rm a /`不起作用,`rm -rf a /`只清空原来的`a`.`unlink a`工作得很好,`unlink a /`什么都不做. (9认同)
  • 这完全应该标记为答案 (7认同)
  • 在OS X 10.10中,`unlink`只是`rm`的别名.这表明在处理目录结构的任何部分时应该使用正确的`rm`规则. (3认同)

Ste*_*e K 17

rm应该删除符号链接.

skrall@skrall-desktop:~$ mkdir bar
skrall@skrall-desktop:~$ ln -s bar foo
skrall@skrall-desktop:~$ ls -l foo
lrwxrwxrwx 1 skrall skrall 3 2008-10-16 16:22 foo -> bar
skrall@skrall-desktop:~$ rm foo
skrall@skrall-desktop:~$ ls -l foo
ls: cannot access foo: No such file or directory
skrall@skrall-desktop:~$ ls -l bar
total 0
skrall@skrall-desktop:~$ 
Run Code Online (Sandbox Code Playgroud)


小智 15

使用rm symlinkname但不要在末尾包含正斜杠(不要使用:) rm symlinkname/.然后会询问您是否要删除符号链接,y以回答是.

  • 你没有错,但正确的答案已经在这里并被接受(4年前!).何必? (62认同)
  • 谷歌在搜索“删除符号链接”时将此作为特色片段。也许它喜欢它的简洁性,不确定它的启发式方法是如何工作的。无论如何,当我回头看我的命令行时,我立即做了一个面部表情:-) (2认同)

Jos*_*hua 12

假设它实际上是一个符号链接,

$ rm -d symlink
Run Code Online (Sandbox Code Playgroud)

它应该弄清楚,但是因为它不能我们启用潜在的代码,这个潜在的代码用于另一个不再存在的情况,但恰好在这里做正确的事情.


Gre*_*ill 7

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


tj1*_*111 5

假设您的设置类似于:ln -s /mnt/bar ~/foo,那么您应该能够rm foo毫无问题地执行 a 。如果不能,请确保您是该文件的所有者foo并且有权写入/执行该文件。删除foo不会触及bar,除非您递归地执行此操作。


小智 5

我也有同样的问题。所以我建议尝试一下unlink <absolute path>

例如unlink ~/<USER>/<SOME OTHER DIRECTORY>/foo