我试图删除“。” 目录。我以为我可以删除工作目录,而不必进入父目录。
我的问题的重点是寻找一些了解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 .另一方面,该命令是.从当前目录中删除条目的指令,这既不被允许(这将违反每个目录都有.指向其自身的条目的约束),也不有用(它不会删除链接)您想删除)。