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


40

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

我的问题的重点是寻找一些了解linux系统如何删除文件的见解。


1
尝试rm
-r'pwd

7
这个问题不重复那个。有人问为什么硬链接作为一个物理实体而不是被合成而存在。这个问题问不仅为什么rm .rmdir .不工作,但他们为什么规定为不工作,这是独立的硬链接的物理存在。
JdeBP '16

9
您已爬入一棵树以切断树枝的图像。开始看到时,您坐在切口的哪一边?(简而言之,这就是Linux文件系统。)
迈克尔

7
想象一下,要做的rm -rf .*不仅是找到它,.而且还包括..,然后../..,然后……
gerrit

Answers:


89

删除当前目录不会影响文件系统的完整性或其逻辑组织。.遵循rmdir(2)手册页中所述的POSIX标准,进行了防止删除的操作:

如果path参数引用的路径的最终成分为点或点-点,则rmdir()将失败。

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

禁止使用rm实用程序删除名称dot和dot-dot,以免因疏忽而执行以下操作:

rm -r。*

另一方面,至少在Unix版本7之前禁止SVR3,直到SVR2为止,明确地删除当前目录(即通过声明其完整路径或相对路径)是Unix下允许的操作。这与删除正在主动读取或写入的文件时发生的情况非常相似。就像没有任何反应一样,访问删除文件的进程将继续其读取和写入操作。删除进程当前目录之后,尽管该目录的路径无法访问,但它的inode仍然存在于文件系统上,直到进程终止或更改其自己的目录为止。

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

当有人类型rmdir .,他们可能希望被删除当前目录中的条目,但是当一个目录被删除(使用其路径),三个目录项实际删除,...,和目录本身。

仅删除.而不删除该目录的目录条目将创建不符合要求的目录,但是如前所述,该目录已被标准禁止。

正如@Emmanuel正确指出的那样,.不允许删除的还有第二个原因。至少有一个与POSIX兼容的OS(带有HFS +的Mac OS X),在严格的限制下,支持创建到现有目录的硬链接。在这种情况下,没有明确的方法可以从目录内部知道要删除的硬链接。


9
pubs.opengroup.org/onlinepubs/9699919799/functions/rmdir.html “删除路径名/ dot的含义不清楚,因为不清楚要删除的父目录中文件(目录)的名称,特别是在存在的情况下目录的多个链接”
Emmanuel

@Emmanuel设计已经禁止删除包含两个以上链接(即不为空)的目录(非空目录)。标准禁止链接计数为1的目录(至少对于链接计数有意义的文件系统而言)。
jlliagre

3
@jlliagre:这不是包含多个链接的目录的问题,而是具有多个链接的目录的问题。某些文件系统和/或操作系统不允许这样做,但并非全部。
约尔格W¯¯米塔格

@JörgWMittag包含多个目录的目录设计上具有多个链接,因为它的所有子目录都..链接到该目录。link count > 2对于绝大多数OS和文件系统来说,这是唯一的情况,因此“某些文件系统和/或操作系统”被轻描淡写了。唯一的非历史性已知例外是带有HFS +的Mac OS X,它增加了关于谁可以做什么的限制。授予POSIX注释是针对这种奇怪的情况。参见unix.stackexchange.com/questions/22394/…–
jlliagre

嘿,我之前做过rm -r .*,它递归地消除了父目录下的所有内容……那是十多年前了,但是很高兴知道rm不再允许这样做了。
antak

9

这样做是出于完整性的考虑,因为您当前位于该目录中,并且.仅仅是自我参考。

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

rmdir `pwd`

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

alias rmc='rmdir `pwd`'

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


13
但是,为什么/如何做的假设rmdir .在一个单向的命令妥协文件系统的完整性rmdir $(pwd)rmdir "$PWD"不?
G-Man说'Resstate Monica'16

4
这不是FS完整性的问题,而是逻辑组织的问题。当选择当前目录时,您告诉外壳程序使用该目录进行后续操作,但是您无法从自身中删除某些内容。
朱莉·佩勒捷

7
恐怕是推测的。
伊曼纽尔

4
@FranklinPiat我没有发现您的评论特别有用:1. OP在哪里使用rm *,shell历史对您意味着什么?2.答案解决了为什么要做的部分,3.关心细节?
JBentley

4
@ G-Man如果这样做rmdir $(pwd),则pwd找出当前目录的逻辑名称,例如/foo/bar/baz,然后在满足条件的情况下rmdir,看到该路径,baz/foo/bar目录中删除该条目。这是有道理的。rmdir .另一方面,该命令是.从当前目录中删除条目的指令,这既不被允许(这将违反每个目录都有.指向其自身的条目的约束),也不有用(它不会删除链接)您删除)。
hobbs
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.