在 Linux 上,当您创建文件夹时,它会自动创建两个硬链接到对应的inode。一个是您要求创建的文件夹,另一个是.
此文件夹的特殊文件夹。
例子:
$ mkdir folder
$ ls -li
total 0
124596048 drwxr-xr-x 2 fantattitude staff 68 18 oct 16:52 folder
$ ls -lai folder
total 0
124596048 drwxr-xr-x 2 fantattitude staff 68 18 oct 16:52 .
124593716 drwxr-xr-x 3 fantattitude staff 102 18 oct 16:52 ..
正如你所看到的,folder
和.
的内部folder
都有相同的 inode 号(用-i
选项显示)。
有没有办法删除这个特殊的.
硬链接?
这仅用于实验和好奇心。
另外我想答案..
也适用于特殊文件。
我试图研究rm
man 但找不到任何方法。当我尝试删除.
所有内容时,我得到的是:
R M: ”。”并且“..”不能被删除
我真的对这些事情的整个运作方式很好奇,所以不要克制自己在这个问题上非常冗长。
编辑:也许我不清楚我的帖子,但我想了解负责.
文件的底层机制以及它们无法删除的原因。
我知道 POSIX 标准不允许硬链接少于 2 个的文件夹,但不明白为什么。我想知道是否有可能做到这一点。
答案1
从技术上来说是可以删除 的.
,至少在 EXT4 文件系统上是这样。如果您在 中创建文件系统映像test.img
,安装它并创建一个test
文件夹,然后再次卸载它,您可以使用以下命令编辑它debugfs
:
debugfs -w test.img
cd test
unlink .
debugfs
不会抱怨并尽职尽责地删除.
文件系统中的目录条目。该test
目录仍然可用,令人惊讶的是:
sudo mount test.img /mnt/temp
cd /mnt/temp/test
ls
仅显示
..
所以.
真的消失了。然而cd .
,,,ls .
还是pwd
一如既往的表现!
我之前使用 完成了此测试rmdir .
,但这会删除目录的 inode (巨大的谢谢红碗为了指出这一点),这留下了test
一个悬空目录条目,并且是遇到问题的真正原因。在这种情况下,该test
文件夹将变得不可用;安装映像后,运行ls
会产生
ls: cannot access '/mnt/test': Structure needs cleaning
内核日志显示
EXT4-fs error (device loop2): ext4_lookup:1606: inode #2: comm ls: deleted inode referenced: 38913
e2fsck
在这种情况下在映像上运行test
会完全删除该目录(目录 inode 已消失,因此无需恢复)。
所有这些都表明它.
作为 EXT4 文件系统中的特定实体存在。我从内核中的文件系统代码得到的印象是它期望.
并..
存在,并且如果不存在则发出警告(请参阅namei.c
),但是通过unlink .
基于 - 的测试我没有看到该警告。e2fsck
不喜欢丢失的.
目录条目,并提出修复它:
$ /sbin/e2fsck -f test.img
e2fsck 1.43.3 (04-Sep-2016)
Pass 1: Checking inodes, blocks, and sizes
Pass 2: Checking directory structure
Missing '.' in directory inode 30721.
Fix<y>?
这将重新创建.
目录条目。
答案2
无法删除此目录条目。该条.
目的意思是“这个目录”,该条..
目的意思是“这个目录的父目录”。它们实际上并不是硬链接,这只是目录结构的创建/表示方式。
答案3
如中所述Lion 对 Unix 6 源代码的注释早期的 Unix 有一个磁盘文件,其中文件和目录在磁盘上都由 inode 结构表示。有一个特殊位表明文件内容是一个目录。每个 inode 都有一个指向其所属 inode 的链接,该链接允许文件知道它所在的目录。例外的是拥有自身的“/”目录。还有一个内容链接。如果索引节点没有内容,则可以将其返回到空闲列表。由于目录只是一个受祝福的文件,即使是空目录也必须包含内容以防止其被垃圾收集。因此 .. 是 inode 到父 inode 的链接,而 ..是否表明该目录仍然可用。 rmdir(通过调用 unlink)可以删除 .如果没有其他内容,则该索引节点将在没有更多引用时移动到空闲列表。
答案4
作为“可能重复”帖子的回答说,POSIX 标准指定如果 rmdir 尝试删除当前目录,它将失败。
无论你建造什么,你都必须有一个基础。如果没有办法说“这里”,就很难定义相对路径。所以 '。'被定义为“这里”。
还有,你能删除“点”和“点点”。编写您自己的操作系统,但不定义它们。尽管 Unix(以及 Mac OSX 的扩展)、Linux,甚至 MS DOS 和 Windows 都使用点和点。
TL;DR - “点”是操作系统的定义。