我需要将一个二进制文件拆分成两个。我想知道是否可以使用 head 和/或 tail,但后来我想知道...对二进制数据使用重定向、管道等是否安全?新行是否会被弄乱,或者空值会被忽略,或者退格或删除会有什么特殊作用?(bash,kubuntu 18.04 LTS)
答案1
是的,如果您将其通过管道传输到另一个进程或将其保存到文件中,则它是安全的。如果您让二进制标准输出打印到终端,则可能会出现“怪异”,因为它可能包含转义序列(随机),这可能会暂时扰乱终端显示。
答案2
head
使用或等命令的主要问题tail
是它们是面向行的,而二进制文件不是。如果它们中有换行符,它们通常不用于表示行的结尾,如果是,它们可能只是程序消息或数据字段等字符串的一部分。
如果数据以任何方式结构化,那么您在选择分割点时必须考虑到这一点,以免在中间破坏结构。
如果你知道文件的结构,则可以使用如下命令
dd -if input-file -of output-file ...
带有选项,仅将从特定(增加)偏移量开始的特定大小的数据块复制到文件中。
看起来split
@egmont 提到的命令会为您自动完成这个过程,但它似乎默认是面向行的,所以您必须指定其他选项,例如--bytes count
告诉它文件的每个部分应该有多大。
附注:如果您不知道文件中有什么,但怀疑它至少包含一些有意义的文本数据,则该strings
命令是初步了解您正在处理的内容的好方法。
strings -n 6 file | less
将找到所有长度至少为 6 个字符的可打印字符,并将它们显示在寻呼机中,这样它们就不会在终端上飞过。使用比默认的 4 个字符稍大的数字有助于消除恰好可打印但未在文件中以这种方式使用的微小数据片段。
如果您稍后必须使用二进制编辑器(例如)更详细地探索该文件hexedit
,您将会得到一些标志,指出在哪里可能会找到一些有趣的东西。
strings
有一个选项 -t x
它会在每个打印的字符串前面以十六进制显示其在文件中的偏移量(o 表示八进制/d 表示十进制),这样您就知道以后在哪里可以找到它。即使非常短的文件,当您必须逐个字符地查看时,也会有很多事情要处理。