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


14

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


4
我有点好奇。你为什么要这个?听起来是个坏主意。
伯恩哈德

3
是的 您在bash脚本中放入了两行,并将其称为“ my-elegant-command”。;)
goldilocks 2013年

2
@Bernhard这是Web应用程序持续集成构建过程的一部分。需要在不更改文件名的情况下压缩静态资产(CSS,JS文件)。当传递给浏览器时,会包含“ content-encoding:gzip”标头,因此扩展名无关。但是,如果更改了文件名,则必须在源HTML文件中进行搜索和替换。
jamieb

如果这确实是您的大问题,则可以定义一个bash函数,该函数将$ *传递给gzip可执行文件,第二行为您执行mv。
布莱奇利2013年

4
@您的网络应用程序问题:任何合适的网络服务器都可以/将为您做压缩...
Bananguin 2013年

Answers:


12

这不起作用:

# 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

您可以通过多种方式作弊。您可以打开文件,然后取消链接-该文件将一直存在,直到您将其关闭-然后创建一个具有相同名称的新文件,并将压缩后的数据写入该文件。但是我不知道强迫bash使用它的明显方法,即使我这样做,我的答案仍然是:

甚至都不做。

如果gzip由于任何原因失败或发生任何问题(例如gzip压缩时空间不足)(因为正在写入其他进程,或者gzip的结果大于输入的值(对于随机数据等),则只是丢失了文件) 。恭喜你!

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


1
为完整起见,如何添加:gzip example.txt && mv example.txt.gz example.txt
2013年

2
没有depquid阅读OP -这是不雅
goldilocks 2013年

@goldilocks“ mv成功创建一个单独的文件。” 可以变得更优雅?我只是想提出一个具体的例子来扩大弗罗斯特斯的答案。如果mv可以比我想象的更优雅地使用,请举一个例子。
2013年

您的建议是简单,优雅,显而易见的方法,但是它是否起作用取决于很多变量,例如,如果已经有example.txt.gz,您将怎么办?同样,由于没有扩展名,您必须以某种方式防止gzipzip已经压缩的文件。那是一堆全新的蠕虫,但这并不是问题的真正组成部分。
弗罗斯特斯

10

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

这是我在没有.gz后缀的情况下递归gzip压缩目录的方法:

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

对我来说似乎很干净。但是是的,看起来您需要mv在某个地方放置一个。

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


1
应该find . -type ...find.加空格,请:)
大肆渲染,

2

-S 您想要的扩展

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

将导致dog.txt_2015_11

解压缩时,必须指定扩展名。

gzip -d _2015_11 dog.txt_2015_11

在UNIX中,使用file命令来确定您拥有的文件类型,扩展名容易引起误解或经常丢失。


1

我认为创建没有扩展名的gzip文件确实不是正确的选择。

恕我直言,您应该配置您的Web服务器以读取.gz文件。您可能已经有如下规则:

Path asets/:
  If header Accept-Encoding contains "gzip" and not contains "gzip;q=0":
    Add header Content-Encoding: gzip

您只需要添加一条规则来重写请求的文件名即可添加“ .gz”(实际上,您应该检查文件是否存在,就像您应该验证客户端是否在其Accept-Encoding标头上列出了gzip一样)


1

您可以尝试使用s3_website

我不喜欢它同时使用scala和ruby编写并且需要JVM的事实。我也不喜欢它的假设(特别是它从存储桶中删除多余文件的事实),但是如果您满意的话,它应该可以工作。

我打算自己编写一个没有这些限制的工具,请继续关注。


0

这实际上并不是您应该执行的操作,主要是因为将文件传输到其他系统或人员时,可能最终会使他们感到困惑,并且找不到作为压缩文件的文件。

如果您不想使用任何后缀,那么GNU对您不利,因为gzip -S ""会返回gzip: invalid suffix ''

但是,您始终可以发送类似gzip -S " "(空格)的内容,并且将显示如下:

$ file testfile\  
testfile: gzip compressed data, was "testfile", from Unix, last modified: Tue Jun  3 XX:XX:XX 2014

然后,如果要解压缩,则必须执行类似操作gunzip -c testfile\ (不指定后缀),甚至使用-f标志。

我真诚地认为,添加mv命令&&不会给您的代码带来太多麻烦。无论如何,正如@frostschutz所说,这样做不是一个好主意。


如果要使用S3来提供压缩文件,例如用于托管静态网站,则需要这样做。您可能会考虑以下问题:github.com/laurilehmijoki/s3_website
Cristian Măgherușan-Stanciu
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.