关于文件名称存储位置的技术问询
文件名称的存储位置技术问询
我执行了以下操作:
$ echo "abcd" > a.txt $ echo "abcd" > aaaaaaaaaaaaaaaaaaaaaaaa.txt $ sha256sum a* fc4b5fd6816f75a7c81fc8eaa9499d6a299bd803397166e8c4cf9280b801d62c a.txt fc4b5fd6816f75a7c81fc8eaa9499d6a299bd803397166e8c4cf9280b801d62c aaaaaaaaaaaaaaaaaaaaaaaa.txt $ ls -hl total 0 -rwxrwxrwx 1 erh-unix erh-unix 5 Sep 27 11:13 a.txt -rwxrwxrwx 1 erh-unix erh-unix 5 Sep 27 11:13 aaaaaaaaaaaaaaaaaaaaaaaa.txt我创建了两个文件:
a.txt和aaaaaaaaaaaaaaaaaaaaaaaa.txt,内容都是ASCII字符abcd。文件名不同,但内容完全一致,它们占用的空间相同(5字节),SHA256哈希也完全一样。想问问这些文件的文件名是存在哪里的?
嘿,这个问题问到点子上了!在你用的这类类Unix文件系统(比如Linux常用的ext4、XFS这些)里,文件名和文件本身的内容、元数据是分开存储的,具体来说:
- 文件名存储在**目录项(Directory Entry)**里:每个目录其实本质上是一个特殊的文件,它的内容就是该目录下所有文件/子目录的目录项集合。每个目录项会记录文件名,以及这个文件名对应的文件的inode编号。
- 而文件的内容、大小、权限、创建时间这些元数据,是存在**inode(索引节点)**里的——inode里完全不包含文件名,只负责管理文件的实际数据块和属性。
回到你的例子:你创建的两个文件内容相同,所以它们的SHA256哈希一致,大小也相同,但它们是两个独立的inode(你可以用ls -i命令查看,会看到两个不同的inode编号),每个inode对应目录里的一个目录项,分别存储a.txt和aaaaaaaaaaaaaaaaaaaaaaaa.txt这两个文件名。
简单来说,文件名就像是目录给文件贴的“标签”,用来让用户找到对应的inode,进而访问到文件内容;而文件内容本身和这个“标签”是分开放置的,所以即使标签不同,只要内容一致(或者像你这样是两个内容相同的独立文件),哈希和大小就不会受文件名影响啦。
备注:内容来源于stack exchange,提问作者jester
相关产品推荐
相关产品推荐

