如何检查 unix/linux 文件的目录结构信息?

Bif*_*iff 3 linux filesystems files

在 Unix 文件系统中,目录只是具有特殊目录结构的特殊文件,其中包含子文件名、文件名大小和 inode 引用号。

超出此范围的实际文件元数据通常存储在 inode 本身中。

我的问题是。如何以原始形式而不是解释形式读取实际的特殊目录结构。

是的,我知道您可以使用 ls 查看那里的文件。那不是我要找的。

psu*_*usi 5

该结构完全取决于所使用的特定文件系统,读取它的唯一方法是直接从磁盘(即 /dev/sda1 )读取,并自己解释文件系统。


Sco*_*ott 5

简单的答案是您想要做的是读取目录文件,使用类似cat ., cat /etc, 或的命令cat mydir。当然,由于这是“原始”数据,您需要使用更适合以人性化方式显示非 ASCII 数据的程序;例如,hexdumpod

不幸的是,正如目录何时停止作为文件可读?,过去二十年左右发布的大多数Unix版本都不允许这样做。所以你的问题的答案可能是“找到一个仍然允许读取目录的 Unix 版本”。AIX、大多数版本的 BSD 以及除最新版本的 Solaris 之外的所有版本都可能符合条件。寻找允许它的 Linux 可能需要使用时间机器。


小智 5

我知道这是一个老问题,但我正在寻找有关目录结构的信息并发现了这个。

要获取目录文件中的原始数据,您可以使用debugfs. 例如:

sudo debugfs /dev/sda1
Run Code Online (Sandbox Code Playgroud)

您可以照常使用lscd、 等,或者cat目录。这不是很可读,所以你可以使用:

dump / dumproot
Run Code Online (Sandbox Code Playgroud)

dumproot这将在您调用的位置创建一个名为debugfs. 要获取它的原始内容,您可以使用xxd. 例如:

xxd dumproot | head -n2

00000000: 0200 0000 0c00 0102 2e00 0000 0200 0000  ................
00000010: 0c00 0202 2e2e 0000 0b00 0000 1400 0a02  ................
Run Code Online (Sandbox Code Playgroud)

这显示了我的目录的.和条目,它们的索引节点号都是 2,即开头的 02000000。对于较大的索引节点编号,您可以在小尾数法的条目开头看到它们。 是十六进制 2e,所以在那里也可见。我不太确定“0c00 0102”代表什么,或者如何指定条目的结尾。当我发现这个线程时,这就是我正在寻找的东西。../.