为什么使用 gzip 时我的脚本中出现意外的文件结尾?

为什么使用 gzip 时我的脚本中出现意外的文件结尾?

对此我有一个疑问:

for i in ./*.gz
do
gunzip -c $i | head -8000 | gzip > $(basename $i)
done

我收到 gzip 的“意外文件结尾”错误,而且根本没有得到 8000,只有几十行。我检查了文件的完整性,一切正常。奇怪的是,如果我运行单个文件:

gunzip -c file1.gz | head -8000 | gzip > file1.gz

我得到了预期的结果。使用此脚本,我可以从包含 10708712 行的压缩文件中获取前 8000 行,然后再次压缩。新文件会覆盖原始文件,但没关系。

答案1

您应该将输出写入临时文件,然后重命名:

for i in ./*.gz 
do 
  gunzip -c "$i" | head -8000 | gzip > "$i.tmp"
  mv -f "$i.tmp" $(basename "$i") 
done

gunzip如果您在阅读时缓冲足够,您的版本有时会起作用。

相关内容