如何查找任何目录未引用其inode的文件

好的,前段时间我发现了鹦鹉螺中的一个错误。

/tmp$ mkdir test/ /tmp$ mkdir test2/ /tmp$ echo "very important stuff" > test/important-file.txt /tmp$ ln -s /tmp/test/ test2/test 

如果你尝试mv test2/test . bash非常聪明,可以回答:

 mv: «test2/test» and «./test» identify the same file 

我创建了一个符号链接来测试(包含文件的目录)在另一个位置,然后我将符号链接移动到目录所在的位置

但是,鹦鹉螺进入游戏:

将符号链接移动到de目录在nautilus中的位置

Nautilus知道符号链接是一个目录,它慷慨地让我合并它们:

在此处输入图像描述

现在,我合并了它们(我显然认为它是两个不同的目录)。 结果……

 tmp$ ls -la lrwxrwxrwx 1 cool-user best-group-ever 9 août 26 23:51 test -> /tmp/test 

好的。 所以我丢失了我的目录(这是正常的,因为我覆盖了它)并最终得到了一个无用的循环符号链接,但是…我的important-file.txt发生了什么? 它有一个inode,我的系统中的任何目录都没有引用它。

显然,我没有在post-it中写那个inode ……所以,它在哪里? 有没有办法找到没有任何目录引用的inode的每个文件?

作为一个额外的问题:这是鹦鹉螺的预期行为,还是一个错误?

为什么以及如何发生这种情况是一个很长的故事,但我在我的目录中有一些非常重要(和保密)的文件我想要回来

不确定是否可能。 毕竟,您的所有可用空间都是一个inode列表。

然而,请参阅ext4的Orphan文件function。

我会发布我的答案,但我不接受它,因为它似乎没有任何意义是好的(至少在效率或完整性方面)。

这将需要一个程序(我用C编写),它递归遍历整个目录树 ,在有序列表中注册每个引用的inode(避免重复),然后将它与实际的inode列表区分开来。

不同的是丢失的文件