我想在二进制文件的开头添加 8 个字节的数据。
有没有用于此的 Linux 命令?
答案1
这是实现此目的的一种方法。
printf "\x68\x65\x6c\x6c\x6f\x20\x77\x6f" | cat - oldfile > newfile
的参数printf
是十六进制的 8 个字节序列。只需将我使用的值(即 ASCII 字符“hello wo”)替换为您的值即可。
答案2
它不是‘那个’命令,而是‘一堆命令’(按照古老的 unix 传统):
- 把你的 8 个字节放到一个文件中
- 将原始文件附加到该文件
- 将新文件重命名为原始文件的名称。
或者:
% echo -n "12345689" > new_file
% cat original >> new_file
% mv new_file original
或者,如果您需要从其他地方读取这 8 个字节:
% dd if=inputstream of=new_file bs=1 count=8
然后按上述步骤继续。
答案3
这不是对原始问题的正确回答,而仅仅是针对@mxmlnkn 评论中非常恰当的关注做出的评论
因此,我需要在 120GB 的文件前面添加 256kB,并且我不想等待 30 分钟来完全复制和写入整个 120GB……没有办法吗?
在网上搜索“fallocate prepend to file”,这应该会向你显示一些基于 StackExchange 的答案(编辑:例如https://stackoverflow.com/a/37884191/9378469)。
鉴于 Linux 4.1+ (XFS) 或 4.2+ (XFS, ext4),fallocate 方法允许您在文件中插入文件系统页面大小的空洞,希望在恒定时间内完成。对于您的问题,这可能足够灵活,也可能不够灵活。
答案4
要将数据添加到二进制文件前面,请增加文件大小,然后添加数据:
xxd file.old | xxd -r -s 8 > file.new;
data="e.i..ght";
echo -n $data | xxd -p | xxd -r -p - file.new
旧文件
00000000 00 00 00 13 02 d1 20 83 00 73 02 b3 00 73 04 33 |...... ..s...s.3|
00000010 00 73 64 b3 00 00 00 13 |.sd.....|
00000018
新建文件
00000000 65 2e 69 2e 2e 67 68 74 00 00 00 13 02 d1 20 83 |e.i..ght...... .|
00000010 00 73 02 b3 00 73 04 33 00 73 64 b3 00 00 00 13 |.s...s.3.sd.....|
00000020