在我得到数百个答案告诉我不可能在 Linux 中硬链接目录之前:是的,我知道这一点。
在我使用(它是 ext4)检查文件系统后,有问题的文件出现在 Lost+fount 中e2fsck
,并且根据 stat 它/是/一个带有 2 个硬链接的文件:
# stat --format="File \"%n\" is a %F with %h hardlinks" ./#30934353
File "./#30934353" is a directory with 2 hardlinks
哦。如何安全删除它们而不触及包含的文件?我尝试过rm
,unlink
都告诉我 die 目录不为空......
答案1
ext4 文件系统上的目录通常至少有 2 个链接。其父目录中的条目和.
自身中的条目。看那里更多细节。
话虽如此,如果文件系统不一致,您很可能会在多个位置链接一个目录,并且链接计数无法反映这一点。
例如,使用debugfs -w
(在未挂载的文件系统上),您可以link a/b c/d
强制创建到目录的链接。您会注意到链接计数未更新(您需要sif a/b links_count 3
更新它):
$ ls -lid a/b c/d a/b/. c/d/.
12 drwxr-xr-x 2 chazelas chazelas 1024 May 14 08:37 a/b/
12 drwxr-xr-x 2 chazelas chazelas 1024 May 14 08:37 a/b/./
12 drwxr-xr-x 2 chazelas chazelas 1024 May 14 08:37 c/d/
12 drwxr-xr-x 2 chazelas chazelas 1024 May 14 08:37 c/d/./
即使有 3 个链接(指向 a、指向 c 以及“.”指向其自身),链接计数仍为 2。
请注意,这fsck
会报告一个问题:
Pass 2: Checking directory structure
Entry 'd' in /c (1282) is a link to directory /a/b (12).
Clear<y>?
因此,如果 fs 刚刚经历过 fsck,则不太可能出现这种情况。
要删除这些链接之一,您可以debugfs -w
再次使用(卸载文件系统后)并unlink c/d
在其中执行操作,或者使用fsck
.如果 adirectory
有多个链接,您可以检查其中..
的条目(使用debugfs
ls
)来检查哪一个是正确的(..
将与其正确的父级具有相同的 inode 编号)。