我有很多数据进入gzip。数据连续流,因此没有结束。当我使用C ^ c停止程序并尝试解压缩时,我收到有关文件末尾的错误。我怎样才能得到压缩输出文件?原因是我希望在计算机重新启动,拔掉插头等时保存我的数据。
$ yes | gzip > out.gz
$ gzip -d out.gz
gzip: blah.gz: unexpected end of file
我不喜欢gzip。
答案 0 :(得分:6)
由于存储压缩数据 - 如果突然中断,您必须准备好丢失与当前滑动窗口相对应的一些数据块(几KB)。没有提到你的磁盘/操作系统可能有大容量缓存的事实,如果停电会导致更大的损失。
为了它的价值,我启动了以下命令,在某些时候打断它:
sh$ yes | nl | tee >(cat > master) >(compress >out.Z) > /dev/null
^C
现在,在文件master
中,我有原始(未压缩)数据,在out.Z
中有相应的压缩数据。或者这是你可能期望的。但是,比较主文件和从压缩文件中提取的数据,你会注意到最后缺少一些记录:
sh$ tail -3 master
11937063 y
11937064 y
119370
sh$ uncompress -c out.Z | tail -3
11936691 y
11936692 y
11
如果我没错,那就是缺少372(非常短)的线。从wc
我发现在该特定运行中对应于4 kiB。
sh$ U=$(uncompress -c out.Z | wc -c)
sh$ R=$(wc -c < master)
sh$ echo $(((R-U)/1024))
4
多次重复测试,我的结果介于0KiB和8KiB之间。 重复测试但是通过ctrl-z(睡眠)中断,我的结果高达24-28 kiB(我猜测 SIGSTOP赢得了冲洗一些缓存而SIGINT没有)。
根据您的需要,这可能是也可能是不可接受的。并记住这只是按^ C / ^ Z中断。我敢打赌,如果停电,结果可能会最糟糕......
答案 1 :(得分:1)
似乎可以使用compress
:
yes | compress >out.Z
uncompress -c out.Z