无法删除指向目录的符号链接

3
我在我的“下载”目录中有一个名为“reference”的目录,其中包含一个符号链接(使用“ln -s”创建)到另一个目录。当尝试删除符号链接时,我会收到冲突的错误消息:
rm 返回“是一个目录”
rmdir 返回“不是一个目录”
这只发生在“cellranger/”(后跟正斜杠)而不是“cellranger”。
[tom@rlgsw68 cellranger]$ pwd
/home/tom/Downloads/reference

[tom@rlgsw68 cellranger]$ ls -lth
lrwxrwxrwx 1 tom genome 33 Apr  4 14:52 cellranger -> /analysisdata/genomes/cellranger/

[tom@rlgsw68 cellranger]$ rm cellranger/
rm: cannot remove directory `cellranger/': Is a directory

[tom@rlgsw68 cellranger]$ rmdir  cellranger/
rmdir: cellranger/: Not a directory

[tom@rlgsw68 cellranger]$ rm cellranger

为什么这两个删除符号链接的命令都无法生效,而且会出现冲突错误?有没有建议的方法可以删除符号链接而不删除源目录中的内容。rm -rf cellranger/也无法删除符号链接(但不会返回错误信息)。

example of terminal session

信息:我正在运行一个Linux服务器(Debian 9.0)。这些错误发生在bash和zsh中。在示例中已删除了模棱两可的名称。当一个目录除了其内容之外还包含指向父目录的链接时,我遇到了这个问题。
/home/tom/Downloads/reference/cellranger/cellranger/ -> /analysisdata/genomes/cellranger/

1
通常,rm 根据 -r 标志或 lstat 检查所给出的对象来决定是删除文件还是目录。可能是 unlinklstat 在进行其他检查之前会检查你提供的路径字符串。如果你提供了 xyzzy/,它可能会立即假设那是一个目录。我的建议是不要在你想要删除的内容后面添加 / :-) - paxdiablo
rm -rf cellranger/ 不会返回错误,但无法删除目录的符号链接。rm -rf cellranger 的效果与 rm cellranger 相同。 - Tom Kelly
根据定义,cellranger/ 指的是链接后面的目录,而 cellranger 是软链接本身。这对于其他工具如 lsstat 也是适用的。因此,rm cellranger 是正确的命令。 - Wiimm
1个回答

4
通过加上尾部斜杠,您指的是符号链接所指向的目录,而不再是符号链接本身。打印inode号(路径在文件系统中所对应的编号)可以显示解除符号链接和目录之间的区别:
$ cd "$(mktemp --directory)"
$ mkdir a
$ stat --format %i a/
9
$ ln --symbolic a b
$ stat --format %i b
10
$ stat --format %i b/
9

这可能与符号链接从未是目录有关,它只是包含路径的文件而已。

1
谢谢,这有助于理解情况。你能解释一下 stat 命令在这里给我们提供了什么信息吗(如何解读它)?这与 ls -l 输出中开头的“l”或“d”类似吗?顺便说一下,我认为你的代码有一个错误(引号不匹配)。我使用的是一个 zsh 配置,可以将文件、链接和目录以不同的颜色显示。 - Tom Kelly

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