我试图删除“。” 目录。我以为我可以删除工作目录,而不必进入父目录。
我的问题的重点是寻找一些了解linux系统如何删除文件的见解。
rm .
和rmdir .
不工作,但他们为什么规定为不工作,这是独立的硬链接的物理存在。
rm -rf .*
不仅是找到它,.
而且还包括..
,然后../..
,然后……
我试图删除“。” 目录。我以为我可以删除工作目录,而不必进入父目录。
我的问题的重点是寻找一些了解linux系统如何删除文件的见解。
rm .
和rmdir .
不工作,但他们为什么规定为不工作,这是独立的硬链接的物理存在。
rm -rf .*
不仅是找到它,.
而且还包括..
,然后../..
,然后……
Answers:
删除当前目录不会影响文件系统的完整性或其逻辑组织。.
遵循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),在严格的限制下,支持创建到现有目录的硬链接。在这种情况下,没有明确的方法可以从目录内部知道要删除的硬链接。
..
链接到该目录。link count > 2
对于绝大多数OS和文件系统来说,这是唯一的情况,因此“某些文件系统和/或操作系统”被轻描淡写了。唯一的非历史性已知例外是带有HFS +的Mac OS X,它增加了关于谁可以做什么的限制。授予POSIX注释是针对这种奇怪的情况。参见unix.stackexchange.com/questions/22394/…–
rm -r .*
,它递归地消除了父目录下的所有内容……那是十多年前了,但是很高兴知道rm
不再允许这样做了。
这样做是出于完整性的考虑,因为您当前位于该目录中,并且.
仅仅是自我参考。
您需要进入其父级或rmdir
使用其路径进行调用,这可以通过以下方式完成:
rmdir `pwd`
如果经常需要,可以为它设置一个别名,例如:
alias rmc='rmdir `pwd`'
..可以单独调用rmc
以删除当前目录。
rmdir .
在一个单向的命令妥协文件系统的完整性rmdir $(pwd)
或rmdir "$PWD"
不?
rm *
,shell历史对您意味着什么?2.答案解决了为什么要做的部分,3.关心细节?
rmdir $(pwd)
,则pwd
找出当前目录的逻辑名称,例如/foo/bar/baz
,然后在满足条件的情况下rmdir
,看到该路径,baz
从/foo/bar
目录中删除该条目。这是有道理的。rmdir .
另一方面,该命令是.
从当前目录中删除条目的指令,这既不被允许(这将违反每个目录都有.
指向其自身的条目的约束),也不有用(它不会删除链接)您想删除)。