我听说 Linux 中的所有内容(包括目录)都是文件。所以我尝试访问目录文件,但是当我尝试读取它时cat
出现错误cat: xp: Is a directory
。使用less
、more
、head
和给出了类似的结果tail
,nl
而使用 Vim 则让我进入了某种导航菜单。
所以,既然我似乎无法找到自己,我就来到这里寻找答案。
所以...目录文件包含哪些类型的信息?
我假设答案包括某种指向该目录中文件的 inode 的链接,但它还包含哪些其他类型的信息?
还有一种方法可以访问该文件并可能对其进行编辑吗?
答案1
目录是文件,因为它们通常具有索引节点结构,并且像为任何其他文件一样保留数据块。
目录必须包含一些包含文件名和相应索引节点号的数据结构。该结构可能是一个简单的列表,或者某种树,这是一个实现细节。在某些文件系统上,一些 inode 数据(例如不变的文件类型)也会在目录中复制,以便更快地访问。 (当然,如果 FS 是 VFAT,那么目录项几乎也是 inode。)
Linux 不允许使用 读取目录的内容read()
,可能是因为原始数据对于用户空间来说是无用的,因为它在不同的文件系统上会有所不同,并且用户空间程序需要了解所有文件系统的内部结构才能利用它。或者,内核需要让每个文件系统呈现一个兼容的目录视图,但这就是getdents()
/readdir()
调用的目的。
其他一些 Unixen 可能允许读取目录内容,例如至少旧版本的 FreeBSD 允许这样做。但即使在这些上,您可能也应该使用readdir()
.
大多数实用程序只是尝试像读取常规文件一样读取目录,从而导致该错误,但像 Vim 这样的智能编辑器以及可能的less
某些脚本使用目录系统调用来代替并为您生成文本列表。
您可以使用特殊工具(例如debugfs
ext2/ext3/ext4)进行一些目录编辑。但我认为即使它也不允许对原始数据进行任意编辑,这听起来像是访问目录时出错或文件系统驱动程序崩溃的秘诀。