Answers:
文件大致是三个独立的部分:
创建空文件时,仅创建索引节点和指向该索引节点的目录条目。稀疏文件(dd if=/dev/null of=sparse_file bs=10M seek=1
)相同。
当创建到现有文件的硬链接时,只需创建指向相同inode的其他目录条目。
我在这里简化了事情,但您明白了。
touch
将创建一个inode,ls -i
或stat
显示有关该inode的信息:
$ touch test
$ ls -i test
28971114 test
$ stat test
File: ‘test’
Size: 0 Blocks: 0 IO Block: 4096 regular empty file
Device: fc01h/64513d Inode: 28971114 Links: 1
Access: (0664/-rw-rw-r--) Uid: ( 1000/1000) Gid: ( 1000/1000)
Access: 2017-03-28 17:38:07.221131925 +0200
Modify: 2017-03-28 17:38:07.221131925 +0200
Change: 2017-03-28 17:38:07.221131925 +0200
Birth: -
请注意,它test
使用0个块。为了存储显示的数据,inode使用一些字节。这些字节存储在inode表中。在ext2页面上查看inode结构的示例。
文件本身不占用任何空间,但是文件系统却占用文件空间,位置,对文件的访问权限等。
简单的答案:因为是这样定义的。
更长的答案:之所以这样定义是因为某些操作在概念上更简单:
您可以做更多的事情:*错误日志文件倾向于创建为空,仅当发生错误时才被填充。*要找出发生了多少错误,您可以对日志文件中的行数进行计数。如果日志文件为空,则错误数为零,这很合理。*有时,您会在文件名中看到所有相关文本的文件,例如this-is-the-logging-directory
。这可以防止急切的管理员在安装后删除空目录,并且还可以防止程序或用户意外创建文件的错误,以便程序以后可以看到目录。该git
程序(和其他程序)倾向于忽略空目录,并且如果项目/管理员/用户希望记录该目录,即使该目录没有有用的内容(尚未),您也可能会看到一个名为empty
或empty.directory
。
没有任何操作变得更加复杂:
对于文件而言,“在某处记录了文件”方面(索引节点和/或文件名)是上述考虑的基础,但是如果空文件无用,文件系统将不会这样做。
通常,上述所有原因(与文件名有关的原因除外)都适用于序列。最值得注意的是字符串,它是字符序列:零长度字符串在程序内部很常见。如果没有意义,通常在用户级别不允许使用字符串:文件名是字符串,并且大多数文件系统不允许将空字符串作为文件名。在内部,从片段创建文件名时,程序很可能会有一个空字符串作为片段之一。