如何删除目录的硬链接?

如何删除目录的硬链接?

在我得到数百个答案告诉我不可能在 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

哦。如何安全删除它们而不触及包含的文件?我尝试过rmunlink都告诉我 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 编号)。

相关内容