
如何把多个 .lz4 文件拼接后用 lz4cat 当作单个文件解压【免费下载链接】lz4Extremely Fast Compression algorithm项目地址: https://gitcode.com/GitHub_Trending/lz/lz4当你手里有若干个用 lz4 压缩出来的.lz4文件又不想逐个解压、也不想在归档层再包一层 tar 时可以利用 lz4 命令行工具README.md 中的lz4CLI基于liblz4的一个特性把多个.lz4文件按字节直接拼接成一个文件之后用lz4cat一次性把它当作单个.lz4文件解压输出结果等价于按原顺序把各源文件拼接起来。本文的主路径是分别压缩源文件 → 用cat拼接 →lz4cat解压 → 用cmp校验结果与按序拼接的源文件一致。前提准备 lz4 命令行工具拼接和解压都依赖lz4可执行文件。如果还没构建在仓库根目录执行make构建完成后仓库根目录会生成lz4二进制Makefile 中lz4目标构建programs并把结果链接到根目录。如果要用系统级命令可以执行make install该命令可能需要 root 权限见 README.md 的 Installation 一节。第一步压缩源文件得到若干 .lz4手动页 programs/lz4.1.md 给出的最简方式是让压缩结果写到 stdout再重定向成.lz4文件lz4 file1 file1.lz4 lz4 file2 file2.lz4 lz4 file3 file3.lz4这里的file1、file2、file3替换为你自己的源文件名。由于lz4 file1 ...依赖“stdout 不是终端时隐式输出到 stdout”这一行为手动页同时提醒在脚本中依赖隐式输出是坏实践应该显式指定输出-c保证输出为 stdout所以脚本里建议写成lz4 -c file1 file1.lz4。如果源文件较多也可以用多文件模式一次压缩tests/test-lz4-multiple.sh 中的用法每个源文件生成一个同名加.lz4后缀的文件lz4 -f -m file1 file2 file3-f在目标文件已存在时直接覆盖-m开启多输入文件模式。这个模式默认保留源文件与gzip -k行为类似。第二步把 .lz4 文件按字节拼接成一个文件programs/lz4.1.md 的 “Concatenation of .lz4 files” 一节明确说明.lz4文件可以直接原样拼接concatenate as islz4会把它当作单个.lz4文件来解压。两种写法都出自文档# 方式一先建首文件再逐个追加 lz4 file1 foo.lz4 lz4 file2 foo.lz4 # 方式二已有多个 .lz4 文件时用 cat 拼接 cat file1.lz4 file2.lz4 file3.lz4 combined.lz4拼接顺序就是后续解压输出的顺序每个帧frame独立携带自己的描述符帧之间唯一的关联是先后顺序解压时按序解码见 doc/lz4_Frame_format.md 的 Frame Concatenation 一节。所以拼接前想清楚文件顺序解压结果就是各源文件内容的按序串联。还有一个可选分支tests/test-lz4-multiple.sh 验证了lz4 -m多文件压缩直接写 stdout 的字节流与cat拼接各.lz4文件的结果完全一致脚本中用cmp比较两者。因此也可以跳过中间文件一步生成拼接流lz4 -m file1 file2 file3 -c combined.lz4第三步用 lz4cat 把拼接文件当作单个文件解压lz4cat等价于lz4 -dcfm-d解压、-c强制写 stdout、-f、-m多文件见 programs/lz4.1.md 的 SYNOPSIS。对手工操作手动页给出的示例是lz4cat foo.lz4 combined.out手动页的原话是lz4cat foo.lz4等价于cat file1 file2即按拼接顺序还原各源文件内容。lz4cat的输出在 stdout所以要落盘必须自己重定向如上面示例。注意手动页同时建议写脚本做解压时优先用lz4 -d或lz4 -dc这类带参数的lz4命令而不是unlz4、lz4cat这些别名。本文按标题使用lz4cat演示脚本中可改写为lz4 -dc combined.lz4 combined.out效果相同。验证结果仓库自带的测试脚本提供了两种可直接复用的校验方式。方式一与按序拼接的源文件比对。参照 tests/test-lz4-multiple.sh 的做法先造一份“参考答案”再比解压结果cat file1 file2 file3 expected.out lz4cat combined.lz4 combined.out cmp expected.out combined.outcmp不输出任何内容即表示两个文件逐字节相同测试脚本以# must be equivalent注释了这一断言。方式二完整性测试与帧列表。手动页定义了-t/--test模式测试压缩.lz4文件的完整性解压出的数据被丢弃不创建也不删除任何文件lz4 -t combined.lz4另可用--list查看文件信息对含多个帧的文件加-v显示每个帧的详细信息--list会自动启用-m修饰符lz4 --list -v combined.lz4该命令会列出拼接文件内部各帧的信息可以用它确认拼接后文件里确实包含你预期的多个帧。限制与注意点拼接顺序即输出顺序。各帧相互独立解码器按序处理所有帧doc/lz4_Frame_format.md。拼接错了顺序解压结果就是错序的源文件串联cmp校验会立即暴露这一点。零字节帧也可以拼接。tests/test-lz4-frame-concatenation.sh 特意构造了“非空 空 非空”三个帧的拼接解压后与源文件cmp一致说明某个源文件是空文件不影响整条流。格式规范层面的定位。多帧拼接解码严格来说超出了 LZ4 Frame 格式规范的强制范围——规范把“在单个流或文件内解码多个拼接帧”留给了实现方参考实现的lz4命令行工具的行为是“按序解码所有拼接帧”。如果你要消费拼接文件的不是 lz4 参考工具而是自己写的解码器这一点需要自行确认。skippable 帧的位置。如果流中会混入 skippable frame用于塞入用户自定义数据doc/lz4_Frame_format.md 不建议让 skippable 帧处于拼接流的开头需要用户数据开头时建议先放一个零字节 LZ4 帧再接 skippable 帧便于文件类型识别。脚本中的输出。手动页提醒不要依赖隐式输出stdout 是否为终端会改变行为-c可保证写 stdoutlz4 -m多文件模式默认保留源文件成功完成后可用--rm删除源文件注意--rm会真实删除文件。完成上述步骤后你的验收标准就一条cmp expected.out combined.out无输出说明lz4cat把拼接流当作单个文件解压出的内容与各源文件按序拼接的结果完全一致。【免费下载链接】lz4Extremely Fast Compression algorithm项目地址: https://gitcode.com/GitHub_Trending/lz/lz4创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考