为什么我不能删除“。” 目录?

Job*_*r69 41 filesystems directory rm

我尝试删除“。” 目录。我以为我可以删除我的工作目录而不必进入父目录。

我的问题的重点是寻找有关 linux 系统如何工作以删除文件的一些见解。

jll*_*gre 90

删除当前目录不会影响文件系统完整性或其逻辑组织。防止.删除是按照rmdir(2)手册页中规定的 POSIX 标准完成的:

如果路径参数指的是最终组件是点或点点的路径,则 rmdir() 将失败。

rm手册页中可以找到一个基本原理:

rm 实用程序禁止删除名称 dot 和 dot-dot 以避免无意中执行以下操作的后果:

rm -r .*

另一方面,显式删除当前目录(即通过说明其完整或相对路径)在 Unix 下是允许的操作,至少从 SVR3 开始,因为它在 Unix 版本 7 中被禁止,直到 SVR2。这与删除正在积极读取或写入的文件时发生的情况非常相似。访问删除文件的进程继续它们的读写操作,就像什么都没发生一样。删除进程当前目录后,该目录将不再可通过其路径访问,但其 inode 仍存在于文件系统中,直到进程终止或更改其自己的目录。

请注意,该进程将无法使用相对于其当前目录的路径来更改其 cwd(例如cd ..),因为..其当前目录中不再有条目。

当有人键入 时rmdir .,他们可能希望删除当前目录条目,但是当删除目录(使用其路径)时,实际上删除了三个目录条目...、 和目录本身。

仅删除.而不删除此目录的目录条目将创建不兼容的目录,但如前所述,标准禁止这样做。

正如@Emmanuel 正确指出的那样,.不允许删除还有第二个原因。至少有一个符合 POSIX 的操作系统(带有 HFS+ 的 Mac OS X),具有很强的限制,支持创建到现有目录的硬链接。在这种情况下,目录内部没有明确的方法可以知道哪个硬链接是预期要删除的硬链接。

  • http://pubs.opengroup.org/onlinepubs/9699919799/functions/rmdir.html "删除路径名/dot的含义不清楚,因为要删除的父目录中的文件(目录)名称不清楚,特别是在存在多个指向目录的链接的情况下” (9认同)
  • @jlliagre:这不是一个*包含*多个链接的目录的问题,而是一个*具有*多个链接的目录。某些文件系统和/或操作系统不允许这样做,但不是全部。 (3认同)

Jul*_*ier 9

这样做是为了完整性,因为您当前位于该目录中并且这.只是一个自我参考。

您需要进入其父级或调用rmdir其路径,这可以通过以下方式完成:

rmdir `pwd`
Run Code Online (Sandbox Code Playgroud)

如果您经常需要它,您可以为它设置一个别名,例如:

alias rmc='rmdir `pwd`'
Run Code Online (Sandbox Code Playgroud)

.. 可以单独调用rmc以删除当前目录。

  • 但是,为什么/如何假设的 `rmdir .` 命令会以 `rmdir $(pwd)` 或 `rmdir "$PWD"` 不会的方式损害文件系统完整性? (13认同)
  • 恐怕这看起来是推测性的。 (7认同)
  • 这不是 FS 完整性的问题,而是逻辑组织的问题。当您选择当前目录时,您告诉 shell 使用此目录进行您即将进行的操作,但您不能从自身中删除某些内容。 (4认同)
  • @FranklinPiat 我没有发现你的评论特别有用: 1. OP 在哪里使用了 `rm *`,你所说的 shell 历史是什么意思?2. 答案解决了*为什么* 部分,3. 需要详细说明吗? (4认同)
  • @G-Man 如果你执行 `rmdir $(pwd)`,`pwd` 会找出当前目录的逻辑名称,例如 `/foo/bar/baz`,然后 `rmdir`,看到该路径,将删除`/foo/bar` 目录中的 `baz` 条目,前提是满足条件。这是有道理的。另一方面,命令 `rmdir .` 是从当前目录中删除 `.` 条目的指令,这是不允许的(它会违反约束,即每个目录都有一个指向自身的 `.` 条目)也没有用(它不会删除您*想要*删除的链接)。 (4认同)
  • 这变成了一场我真的不在乎的非常奇怪的无用辩论。我给出了一个合理的理由和解决问题的办法。POSIX 委员会可能没有写下他们所拥有的每一个理由,尤其是那些看起来很明显的东西,因为他们可能认为对其他人来说是这样,而且也并不真正关心这一切。他们只是定义了规则,正如我所评论的,这些规则可以以不同的方式处理以适应不同的看法。 (2认同)