追加缺失部分

追加缺失部分

我的备份驱动器上有一个文件foo.txt(30 GiB)。

我的常规驱动器上有一个文件foo.txt(60 GiB,保证前 30 GiB 完全相同)。

我怎样才能仅附加缺失的部分而不重新复制整个文件?

也许有些东西dd可以用?

答案1

要同步文件rsync,它有一个--append选项“将数据附加到较短的文件中”:

rsync --append /path/to/foo.txt /path/to/foo.txt
#              ^- original      ^- copy

示例运行

测试场景公然抄袭了steeldriver的答案——我添加了-P-v选项以获得详细输出。

$ dd if=/dev/urandom bs=1M iflag=fullblock count=60 of=origfile
60+0 records in
60+0 records out
62914560 bytes (63 MB, 60 MiB) copied, 0.328983 s, 191 MB/s
$ dd if=origfile bs=1M iflag=fullblock count=30 of=newfile
30+0 records in
30+0 records out
31457280 bytes (31 MB, 30 MiB) copied, 0.0292976 s, 1.1 GB/s
$ cmp origfile newfile
cmp: EOF on newfile
$ rsync -Pv --append origfile newfile
origfile
     62,914,560 100%  365.47MB/s    0:00:00 (xfr#1, to-chk=0/1)

sent 31,465,039 bytes  received 35 bytes  20,976,716.00 bytes/sec
total size is 62,914,560  speedup is 2.00
$ cmp origfile newfile
$ 

答案2

是的,你可以使用dd- 诀窍是选择bsxskipobsxseek等于精确的所需偏移量

前任。

首先让我们生成一个测试文件-为了说明起见,我选择了 60MiB 而不是 60GiB:

$ dd if=/dev/urandom bs=1M iflag=fullblock count=60 of=origfile
60+0 records in
60+0 records out
62914560 bytes (63 MB, 60 MiB) copied, 0.376846 s, 167 MB/s

现在让我们准确复制它的前半部分 - 再次使用dd(尽管这不是必需的)

$ dd if=origfile bs=1M iflag=fullblock count=30 of=newfile
30+0 records in
30+0 records out
31457280 bytes (31 MB, 30 MiB) copied, 0.063891 s, 492 MB/s

验证它们是否不同:

$ cmp origfile newfile
cmp: EOF on newfile after byte 31457280, in line 122106

现在让我们从 复制origfile到,跳过两个文件的newfile30x 个块:1M

$ dd if=origfile bs=1M iflag=fullblock skip=30 count=30 of=newfile seek=30
30+0 records in
30+0 records out
31457280 bytes (31 MB, 30 MiB) copied, 0.0632964 s, 497 MB/s

最后,验证文件现在是否相同:

$ cmp origfile newfile
$ 

答案3

这是一个巨大的文件,但如果它可以处理这个大小,您可以使用命令split将 60GB 的文件拆分为file1file2。然后使用cat将您想要的部分重新组合在一起。

例子:

split -n2 60Gfile
cat xab >> 30Gfile

split -n2将文件分成两半,生成两个文件,分别xaa名为xab

如果这不能满足您的要求,请阅读拆分手册,因为该命令还有其他选项。

相关内容