我想创建一个保留原始文件名的 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。另外,我不喜欢它所做的假设(尤其是它从存储桶中删除额外文件的事实),但如果您对此感到满意,它应该可以工作。
我打算自己写一个没有这些限制的工具,敬请期待。