我有一个非常大的文件(准确地说是 999,952,379,904 字节),它是部分磁盘映像。在十六进制编辑器中查看它,我发现其结构如下:
0-2073 字节偏移量包含创建文件的工具添加的一些标头信息。我可以忽略它们。
2074 字节以后是 1048580 字节的块,包含 1048576 个数据,后跟 4 字节 CRC 值。
我正在寻找一种有效的方法,从 2074 字节的偏移量开始,并将 1048580 字节块(不包括 4 字节 CRC 值)复制到输入文件的末尾。看起来文件没有以完整的块结尾,所以我要么排除最后一个块,要么用零填充它。
dd 显然可以适应从偏移量开始,但是有没有办法在复制时排除每个块的最后 4 个字节?
答案1
您可能必须创建 bash 循环并跳过dd
每个块所需的字节。
编写简单的 C 程序更容易。
$ cat> cvt.c #包括 <unistd.h> #include <string.h> #定义 SKIPBYTES (2074) #定义 BUFSIZE (1048580) #定义 STRIPBYTES (4) 空主() { char buf[BUFSIZE]; /* 用于保存要传输的一个数据块的缓冲区 */ ssize_t计数=0; read(0,buf,SKIPBYTES); /* 读取要跳过的初始数据 */ 而(1) { memset( (void *)buf,0,BUFSIZE); /* 用零字节填充 */ count=read(0,buf,BUFSIZE); /*可能读取一个完整的缓冲区*/ 如果 (计数>0) write(1,buf,BUFSIZE-STRIPBYTES); /* 写入几乎所有字节 */ 别的 休息; }; }
按住并CTRL击打d一次。
$ gcc -o cvt cvt.c $ chmod 755 cvt $ ./cvt <largefile.raw >filtered-file.dd
注意,“fd”0 是 stdin,1 是 stdout,2 是 stderr
检查:
$ man read
$ man 2 write