bash - 如何有效地将多个大 .gz 文件合并为一个?

标签 bash compression gzip large-files gunzip

我正在尝试将多个 (29) 个压缩文件 (.gz) 一个接一个地组合成一个文件。

压缩文件约为 500MB,未压缩格式约为 30GB。所有文件都以我不希望出现在最终文件中的 header 开头。

我尝试过使用zcatgzip来实现,但是需要很长时间(超过3小时):

 zcat file*.gz | tail -n +2 | gzip -c >> all_files.txt.gz 

我也用pigz尝试过:

 unpigz -c file*.gz | tail -n +2 | pigz -c >> all_files_pigz.txt.gz 

在这种情况下,我在一个集群中工作,他们没有此命令,我无法安装任何东西。

我尝试的最后一件事是将所有内容与 cat 合并:

 cat file*.gz > all_files_cat.txt.gz

这并不需要很多时间,但是当我要阅读它时,在某些时候会出现以下消息:

 gzip: unexpected end of file

我该如何处理这个问题?

最佳答案

如果您想删除每个未压缩文件的第一行,并将它们全部连接到一个压缩文件中,则需要一个循环。类似的东西

for f in file*.gz; do
  zcat "$f" | tail -n +2
done | gzip -c > all_files_cat.txt.gz

如果有很多大文件,是的,可能需要一段时间。也许使用比默认值更低的压缩级别(以更大的文件大小为代价)。或者使用与 gzip 不同的压缩程序;有很多选项,每个选项都有自己的速度和压缩比权衡。

关于bash - 如何有效地将多个大 .gz 文件合并为一个?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57801347/

相关文章:

asp.net - 用于 WCF Rest 服务的 POST 数据的透明 GZIP 解压缩

asp.net - 什么是最好的 HTML+CSS 压缩方法?

java - 通过 Netty 的 HTTP 处理程序发送预压缩的数据

php - 使用 phpseclib 将 mysql gzipped 备份下载到本地系统

c - 如何将 'ls' 命令转换为 'cat' 命令?

Bash:getopts 中的默认 bool 值

c - zlib compress() 返回 Z_BUF_ERROR 尽管缓冲区分配给 compressBound 的结果(文件太大?)

apache - 流式传输数据时 gzip 压缩率如何变化?

windows - Gitlab CI : How to use the bash shell on a Windows runner

python - 同时运行同一程序的多个版本