当我对我的 CD 收藏进行排序时,我发现处理 的输出find
得到sort -u
的列表比普通的 更小sort
,所以我进行了调查。使用diff
输出,我找到了重复文件的名称,然后我实际检查了同一个文件如何可以存在两次。事实上,被重复的文件 ,32
在 中存在两次fonts/basic
。文件系统是ISO9660:
root@user-desktop:/mnt/loop/fonts/basic# ls -al
total 22
dr-xr-xr-x 1 root root 2048 1978-07-01 00:47 .
dr-xr-xr-x 1 root root 12288 1978-07-01 00:48 ..
-r-xr-xr-x 1 root root 3884 1978-07-01 00:47 32
-r-xr-xr-x 1 root root 3884 1978-07-01 00:47 32
root@user-desktop:/mnt/loop/fonts/basic# ls -l -i
total 8
203394 -r-xr-xr-x 1 root root 3884 1978-07-01 00:47 32
203394 -r-xr-xr-x 1 root root 3884 1978-07-01 00:47 32
好吧,它们是硬链接的,因为它们有相同的 inode,但它们怎么会有相同的名称呢?为什么它们报告只有一个硬链接?
root@user-desktop:/mnt/loop/fonts/basic# mount|grep mnt/loop
/dev/loop0 on /mnt/loop type iso9660 (ro)
有人能解释一下吗?是不是因为ISO9660文件系统?
答案1
让我们做一个简单的ISO9660文件系统:
mkdir cd
echo 'hello world' > cd/foo
echo '42' > cd/bar
genisoimage -o cd.iso cd
安装、检查并卸载它:
gnome-disk-image-mounter cd.iso
ls -li /media/user/CDROM
1474 -r-------- 1 user user 3 Jul 18 19:38 bar
1475 -r-------- 1 user user 12 Jul 18 19:38 foo
umount cd.iso
现在在十六进制编辑器中打开该图像,并将其替换FOO.;1
为BAR.;1
。如果有帮助的话,我系统上的 inode 编号实际上是目录条目在 ISO 映像 / 32 中的偏移量,即查看 左右python -c 'print hex(inode*32)'
。
ISO9660, 喜欢胖的,没有 inode,但 Linux 假装有。所有信息都直接存储在目录中,并且由于每个可变长度条目至少超过 32 个字节,因此可以保证所有“inode”都是唯一的。
现在重新安装并再查看一下:
gnome-disk-image-mounter cd.iso
ls -li /media/user/CDROM
1474 -r-------- 1 user user 3 Jul 18 19:38 bar
1474 -r-------- 1 user user 3 Jul 18 19:38 bar
umount cd.iso
注意“inode”编号和文件大小。这两个文件仍在映像中,但重复的文件名使 Linux 感到困惑,导致它列出第一个文件两次。第二个文件现在完全无法访问。