将文件合并为一个

6

目前我在这个目录下 -

/data/real/test

当我在命令提示符下执行ls -lt时,会得到以下结果-
REALTIME_235000.dat.gz
REALTIME_234800.dat.gz
REALTIME_234600.dat.gz
REALTIME_234400.dat.gz
REALTIME_234200.dat.gz

如何在Unix中将上述的五个dat.gz文件合并成一个dat.gz文件,而不会丢失任何数据。我是Unix新手,对此不确定。有人能帮帮我吗?
更新:我不确定哪种方法最好,是应该先解压缩每个五个文件然后再合并成一个?还是直接把所有的五个 dat.gz 合并成一个dat.gz
3个回答

12
如果可以随意拼接文件内容,那么下面的命令就可以实现这个功能:
zcat REALTIME*.dat.gz | gzip > out.dat.gz

更新

这应该解决订单问题:

zcat $(ls -t REALTIME*.dat.gz) | gzip > out.dat.gz

我尝试执行以下命令:zcat *.gz | gzip > out.dat.gz。但是我遇到了错误信息:对于所有五个文件,都显示 REALTIME_EXPORT_v1x0_20120801_9_T_234000_234200.dat.gz.Z: No such file or directory。这是为什么呢? - AKIWEB
4
@Nevzz03 你是否使用的是Solaris而不是Linux? 如果是,使用gzcat *.gz | gzip > out.dat.gz。在Solaris上,zcat实用程序使用不同的压缩套件(compressdecompress),其后缀为.Z,而非.gz。这在其他非Linux Unix系统上(如AIX等)也可能是这种情况... - twalberg
请查看Mark Adler的答案。速度快1000倍且更加正确。 - Morlock
@Morlock Mark正在使用cat,因此它无法处理OP所要求的压缩文件。 - Ivan Nevostruev
@IvanNevostruev 是的,gzip格式的美妙之处就在于此。如果你cat a.txt和b.txt,然后gzip或gzip它们两个,再cat,你会得到两个完全相同内容的归档文件。为了验证,请解压缩这两个归档文件并使用md5sum。 (我刚刚重新尝试以确认)。这就是为什么Mark Adler指出不必将其解压缩然后重新压缩的原因。 - Morlock
显示剩余2条评论

5
你解压缩结果后想要发生什么? 如果你希望这五个文件重新出现,那么你需要使用除gzip (.gz)格式之外的其他格式。 你需要使用tar (.tar.gz)或者zip (.zip)。
如果你希望gunzip的结果是原始文件gunzip的连接,则可以简单地将文件cat (不是zcat或gzcat)在一起。 gunzip将把它们解压缩成一个单独的文件。
cat [files in whatever order you like] > combined.gz

然后:

gunzip combined.gz

将产生原始文件的gunzip串联的输出。

建议不必将所有文件解压缩,然后重新压缩为一个流。


-1
看起来几乎像是黑魔法,但实际上你可以直接连接GZ文件!
这种格式就是为此而设计的(以及MP3)。在内部,GZ以独立的压缩流块组织,每个块都有自己的头部、压缩字典、校验和等等。
因此,当你连接多个GZ文件时,未压缩的流正好是原始文件的连接。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接