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