join大量重叠的文件

我正试图从崩溃的磁盘恢复(MySQL)数据库。 有一些最近转储,这是损坏的bz2文件。 由于数据库不会经常更改,所以转储应该几乎相同。 bzip2recover从文件中恢复了大约70-80%的块,所以大部分(如果不是全部)数据可以通过find文件中的重叠并将它们连接在一起来恢复。 例如:

 dump1: |-----------------|xxxxxxxxxxxxxxxx|------------------| dump2: |-------------|----------------|xxxxxxxxxxxxxxxxxxxxxx| dump3: |xxxxxxxxxxxxxxxxxxxxxx|---------------|xxxxxxxxxxxxxx| 

在这里我可以检测到dump1中的第一个数据块是由dump2中的第二个数据块继续存储的,dump2中的第二个数据块继续是dump3中的第二个数据块。 通过join这四个文件,我已经恢复了数据。

问题是,有成千上万的文件(我有每个大约400个1M块的十个转储)。 有没有一个工具可以自动化这个过程,或者至less是其中的一部分(像一个Linux命令检查一个文件的结尾和另一个文件的开始之间的最长重叠)?

我需要这个完全一样的东西。 我想出了这个令人惊讶的快速Python代码(它在30秒内join了两个2GB的文件与800MB的重叠。)调整overlap_size为您的块需要。 它应该尽可能长,但小于实际的重叠大小。

 #!/usr/bin/env python import sys overlap_size = 100000000 # 100MB a = file(sys.argv[1]).read() b = file(sys.argv[2]).read() end = a[-overlap_size:] offset = b.find(end) c = file(sys.argv[3], 'wb') c.write(a[:-overlap_size]) c.write(b[offset:]) c.close() 

用法:

 ./join.py chunkA chunkB outputAB ./join.py outputAB chunkC outputABC ./join.py outputABC chunkD outputABCD ...etc 

我没有一个工具可以完全完成这项工作,但是您可以使用如下工具:

 cmp -l dump1 dump2 

这将给你不同的字节和他们的偏移量的列表。 重叠是没有由cmp打印的偏移的地方。

此外,您可以使用dd命令复制部分转储并将其附加到另一个转储。

您可以尝试编写自己的使用这些工具的脚本,或者编写一个小的C程序来比较这些文件并复制所需的部分。

我希望你发现这些想法有帮助。

就像一个linux命令检查一个文件的结尾和另一个文件的开始之间的最长重叠

传统上,这将是diff 。 它会产生两个给定文本文件的“差异”作为输出,以及一些控制信息(已添加的内容,已删除的内容,要检查的行)。 patch命令能够反转进程。

理论上,你应该可以在你的不同块上使用diff ,在其输出上稍作处理(就像删除删除命令一样),然后把它传给patch

 # echo 'this > is > a' > file1 # echo 'a > chunked' > file2 # echo 'chunked > data > file' > file3 # diff file2 file1 | egrep -v '^>' | patch -p0 -R file1 -o file12 patching file file1 # cat file12 this is a chunked # diff file3 file12 | egrep -v '^>' | patch -p0 -R file12 -o - patching file file12 this is a chunked data file # 

请注意,如果您有非常大的input文件, diff将需要大量的内存。

我想你只能自己写一个这样的工具。

从最大的文件开始,并将其作为图像复制到内存中。

然后逐个遍历所有文件,寻找与当前内存映像的第一个或最后一个块的重叠。 如果发现重叠,请扩展内存映像。

重复,直到你没有添加任何字节通过所有的文件。 然后将内存映像写入文件。