【问题标题】:Cannot remove symbolic link to directory无法删除目录的符号链接
【发布时间】:2019-08-26 21:18:11
【问题描述】:

我的Downloads 目录中有一个目录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/ 也不会删除符号链接(但不会返回错误)。

信息:我正在运行一个 linux 服务器 (Debian 9.0)。 bash 和 zsh 都会出现这些错误。模棱两可的名称已从示例中删除。当目录除了内容之外还包含指向父目录的链接时,我遇到了这种情况:

/home/tom/Downloads/reference/cellranger/cellranger/ -> /analysisdata/genomes/cellranger/

【问题讨论】:

  • 通常情况下,rm 会根据-r 标志或lstat-ing 你给它的东西来决定是删除文件还是目录。可能unlinklstat 的路径会在任何其他检查之前检查您提供的字符串。如果您提供xyzzy/,它可能会立即假定这是一个目录。我的建议是不要将/ 添加到您要删除的任何内容中:-)
  • rm -rf cellranger/ 不返回错误但无法删除目录的符号链接。 rm -rf cellrangerrm cellranger 一样工作。
  • 根据定义,cellranger/ 指向链接后面的目录,cellranger 指向软链接本身。对于lsstat 等其他工具也是如此。所以rm cellranger 是正确的命令。

标签: bash shell directory rm ln


【解决方案1】:

通过放置一个斜杠,您指的是符号链接指向的目录,不再是符号链接本身。打印 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

这可能与符号链接永远不是目录,它始终只是包含路径的文件这一事实有关。

【讨论】:

  • 谢谢,这有助于了解情况。您能否解释一下 stat 命令在这里给了我们什么(如何解释它)。这是否类似于ls -l 输出开头的“l”或“d”。顺便说一句,我认为您的代码中有错误(不匹配的引号)。我使用不同颜色的文件、链接和目录的 zsh 配置。
猜你喜欢
  • 2010-09-17
  • 1970-01-01
  • 2012-09-20
  • 2012-09-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-09-06
  • 2014-04-09
相关资源
最近更新 更多