如何创建不带 .gz 文件扩展名的 gzip 文件?

如何创建不带 .gz 文件扩展名的 gzip 文件?

我想创建一个保留原始文件名的 gzip 压缩文件。例如,gzipping“example.txt”应输出名为“example.txt”而不是“example.txt.gz”的 gzip 压缩文件。是否可以使用一个命令优雅地完成此操作(不执行后续命令mv)?

答案1

这不起作用:

# echo Hello World > example.txt
# gzip < example.txt > example.txt # WRONG!
# file example.txt
example.txt: gzip compressed data, from Unix, last modified: Thu Mar 21 19:45:29 2013
# gunzip < example.txt
<empty file>

这是一个竞争条件:

# echo Hello World > example.txt
# dd if=example.txt | gzip | dd of=example.txt # still WRONG!
# gunzip < example.txt 
Hello World # may also be empty

问题是> example.txt(或dd of=example.txt就此而言)在其他进程有机会读取该文件之前杀死该文件。所以没有明显的解决方案,这就是为什么你应该坚持使用mv.

您可以通过多种方式进行作弊。您可以打开该文件,然后取消链接 - 该文件将继续存在,直到您关闭它 - 然后创建一个同名的新文件并将 gzip 压缩的数据写入该文件。然而我不知道强制 bash 使用它的明显方法,即使我知道,我的答案仍然是:

甚至不要这样做。

如果gzip由于任何原因失败,或者出现任何问题,比如在 gzip 压缩时空间不足(因为其他进程正在写入,或者 gzip 结果大于输入 - 这发生在随机数据上 - 等等),你就会丢失文件。恭喜!

创建一个单独的文件并mv成功。这是您能找到的最简单、易于理解且最可靠的方法。

答案2

作为 CI 部署到 AWS S3 的一部分,我遇到了同样的问题。

这就是我对不带后缀的目录(就地)进行递归 gzip 所做的.gz

find . -type f -exec gzip "{}" \; -exec mv "{}.gz" "{}" \;

对我来说似乎足够干净。但是,是的,看起来你需要mv在某个地方。

如果你正在使用,grunt你可以看看grunt-contrib-compress。一些grunt专门用于部署到 S3 的工具也将为您处理 gzip。

答案3

-S你想要的扩展

gzip -S "`_date +%Y_%M' dog.txt 

将产生dog.txt_2015_11

解压时必须指定扩展名。

gzip -d _2015_11 dog.txt_2015_11

在 unix 中,使用 file 命令来确定您拥有的文件类型,扩展名会产生误导或经常丢失。

答案4

你可以试试s3_网站为了这。

我不喜欢它是用 scala 和 ruby​​ 编写的,而且它需要 JVM。另外,我不喜欢它所做的假设(尤其是它从存储桶中删除额外文件的事实),但如果您对此感到满意,它应该可以工作。

我打算自己写一个没有这些限制的工具,敬请期待。

相关内容