我有很多数据要导入gzip。数据是连续的,所以没有尽头。当我使用C^ C停止程序并尝试解压缩时,我得到一个关于文件结尾的错误。我怎样才能得到一个压缩的输出文件?原因是我想在电脑重启、拔掉插头等情况下保存我的数据。
$ yes | gzip > out.gz
$ gzip -d out.gz
gzip: blah.gz: unexpected end of file
我不附属于gzip。
由于您存储的是压缩数据——如果当前滑动窗口突然中断,您必须准备好丢失一些对应于当前滑动窗口的数据块(几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 (sleep)中断,我得到的结果高达24-28 kiB(我猜测 SIGSTOP不会刷新一些缓存,而SIGINT则会)。
根据您的需要,这可能是可接受的,也可能是不可接受的。记住,只有按下^C/^Z才会中断。我敢打赌,如果停电,结果可能会糟糕得多……
似乎适用于compress
:
yes | compress >out.Z
uncompress -c out.Z