有两个稀疏文件。 经 证明它们是相同的diff
。 但比较花了 20 分钟(太长了)。 我想把tar
它们分成小文件以加快比较速度。 但它们的tar
输出不同。
它们是 512GB 的巨大的稀疏文件,只有大约 40K 有意义的数据。
% ls -l sparse_file_one/
total 40
-rw-r--r-- 1 midnite midnite 512711720960 Mar 4 23:12 sdd.img
% ls -l sparse_file_two/
total 48
-rw-r--r-- 1 midnite midnite 512711720960 Mar 4 23:13 sdd.img
% du sparse_file_one/sdd.img
40 sparse_file_one/sdd.img
% du sparse_file_two/sdd.img
48 sparse_file_two/sdd.img
diff
比对耗时20分钟,结果证明二者完全相同。
% diff -qs --speed-large-files sparse_file_one/sdd.img sparse_file_two/sdd.img | pv
68.0 B 0:20:57 [55.4miB/s] [ <=> ]
Files sparse_file_one/sdd.img and sparse_file_two/sdd.img are identical
由于它们的du
磁盘使用情况不同,我研究filefrag
并确认它们的内部表示不同。
% filefrag -v sparse_file_one/sdd.img
Filesystem type is: ef53
File size of sparse_file_one/sdd.img is 512711720960 (125173760 blocks of 4096 bytes)
ext: logical_offset: physical_offset: length: expected: flags:
0: 0.. 0: 6866944.. 6866944: 1:
1: 8192.. 8194: 6852608.. 6852610: 3: 6875136:
2: 12288.. 12288: 6854656.. 6854656: 1: 6856704:
3: 16384.. 16384: 6868992.. 6868992: 1: 6858752:
4: 16448.. 16449: 6869056.. 6869057: 2:
5: 16512.. 16512: 6869120.. 6869120: 1: last
sparse_file_one/sdd.img: 4 extents found
% filefrag -v sparse_file_two/sdd.img
Filesystem type is: ef53
File size of sparse_file_two/sdd.img is 512711720960 (125173760 blocks of 4096 bytes)
ext: logical_offset: physical_offset: length: expected: flags:
0: 0.. 0: 6871040.. 6871040: 1:
1: 8192.. 8195: 6856704.. 6856707: 4: 6879232:
2: 12288.. 12288: 6858752.. 6858752: 1: 6860800:
3: 16384.. 16384: 6860800.. 6860800: 1: 6862848:
4: 16448.. 16449: 6860864.. 6860865: 2:
5: 16512.. 16512: 6860928.. 6860928: 1:
6: 125173759..125173759: 132128862.. 132128862: 1: 132018175: last,eof
sparse_file_two/sdd.img: 5 extents found
tar
很快就完成了。几乎不需要任何时间。但tar
输出大小不同。难怪它们不会被比较为完全相同。
% cd ../sparse_file_one/
sparse_file_one % tar -cvSf sdd.img.tar --mtime=@0 sdd.img | pv
tar: Option --mtime: Treating date '@0' as 1970-01-01 08:00:00
sdd.img
8.00 B 0:00:00 [26.2KiB/s] [ <=> ]
sparse_file_one % ls -l
total 80
-rw-r--r-- 1 midnite midnite 512711720960 Mar 4 23:12 sdd.img
-rw-r--r-- 1 midnite midnite 40960 Mar 5 00:22 sdd.img.tar
% cd ../sparse_file_two
sparse_file_two % tar -cvSf sdd.img.tar --mtime=@0 sdd.img | pv
tar: Option --mtime: Treating date '@0' as 1970-01-01 08:00:00
sdd.img
8.00 B 0:00:00 [ 520KiB/s] [ <=> ]
sparse_file_two % ls -l
total 100
-rw-r--r-- 1 midnite midnite 512711720960 Mar 4 23:13 sdd.img
-rw-r--r-- 1 midnite midnite 51200 Mar 5 00:23 sdd.img.tar
(关于这个帖子,使无效的档案库mtime
变得完全相同tar
。我可以从其他相同的稀疏或非稀疏文件。但这种行为显然不能保证。
(根据这个邮政,如果我可以提取稀疏文件的内容不到10分钟,这样验证它们是否相同会更快。但我不懂 Python。如果某个 Linux 原生程序能做到这一点就好了。)
PS-我更喜欢使用diff
目录cmp
递归比较的可能性。
答案1
我认为我制作的这个工具可能对你有用: https://github.com/ArthurMLago/sparsediff
我还必须比较巨大的稀疏文件,表观大小为 60G,实际磁盘使用量为几百 k。我在网上找不到好的解决方案,所以我最终制作了自己的应用程序lseek
,使用SEEK_HOLE
和SEEK_DATA
来高效地查找第一个文件的相关部分,并与第二个文件进行比较。输出灵感来自hexdump -C
,适用于二进制文件。