GZIP不作为目录解压缩

我想压缩一个文件夹,所以我可以FTP它到我的Web服务器。

我在osx雪豹上压缩,并在Ubuntu 8.04上解压缩

这是我正在运行的两个命令

sudo git archive master | gzip > v-1.25.gz sudo gunzip v1.25.gz 

当我在本地机器上解压缩时,它工作正常,但在服务器上的输出是一个文件而不是目录

我究竟做错了什么?

如果您来自Windows世界,您习惯使用zip或rar等压缩文件集合的工具。 在典型的Unix方面,做一件事情,做一件好事的传统,你往往有两个不同的工具; 一个压缩工具和一个档案格式。 然后,人们将这两个工具一起使用,以提供与zip或rar相同的function。

有许多不同的压缩格式。 现在Linux上常用的是gzip(有时称为zlib)和更新的更高性能的bzip2。 不幸的是,bzip2使用更多的CPU和内存来提供更高的压缩率。 您可以使用这些工具压缩任何文件,按照惯例,使用这两种格式之一压缩的文件是.gz和.bz2。 您可以使用gzip和bzip2压缩,gunzip和bunzip2来解压缩这些格式。

还有几种可用的存档格式,包括cpio,ar和tar,但是人们往往只使用tar。 这些允许你把一些文件打包成一个文件。 他们还可以包含path和权限信息。 您可以使用tar命令创build和解压t​​ar文件。 您可能会听到这些称为“tarring”和“untarring”的操作。 (这个命令的名字来自磁带归档的缩写,Tar是对ar格式的一个改进,因为你可以使用它来跨越多个物理磁带进行备份)。

  # tar -cf archive.tar list of files to include 

这将创build(-c)并归档到一个名为archive.tar的文件中。 (.tar是tar档案的约定扩展)。 您现在应该有一个包含五个文件(“list”,“of”,“files”,“to”和“include”)的单个文件。 如果你给tar一个目录,它会recursion到这个目录中,并把它里面的所有内容都存储起来。

  # tar -xf archive.tar # tar -xf archive.tar list of files 

这将提取(-x)以前创build的archive.tar。 您可以通过在命令行的末尾列出来从档案中提取所需的文件。 在我们的例子中,第二行提取“list”,“of”,“file”,但不是“to”和“include”。 你也可以使用

  # tar -tf archive.tar 

在提取它们之前获取内容列表。

所以现在你可以结合这两个工具来复制zip的function:

  # tar -cf archive.tar directory # gzip archive.tar 

你现在将有一个archive.tar.gz文件。 你可以使用下面的方法解压

  # gunzip archive.tar.gz # tar -xf archive.tar 

我们可以使用pipe道来保存我们有一个中间的archive.tar:

  # tar -cf - directory | gzip > archive.tar.gz # gunzip < archive.tar.gz | tar -xf - 

您可以使用-f选项指定stdin或stdout(tar知道哪一个基于上下文)。

我们可以做得稍微好一些,因为在轻微地破坏“一个工作好”的想法的时候,tar有能力使用-z参数来压缩它的输出和解压缩它的input(我说很明显,因为它仍然使用gzip和gunzip后台命令行)

  # tar -czf archive.tar.gz directory # tar -xzf archive.tar.gz 

要使用bzip2而不是gzip,分别使用bzip2,bunzip2和-j而不是gzip,gunzip和-z(tar -cjf archive.tar.bz2)。 一些版本的tar可以使用-z检测bzip2文件存档,并做正确的事情,但是可能值得养成明确的习惯。

回到你的特定问题。 git存档可以创build一个tar文件或一个zip文件。 默认情况下它会创build一个tar文件。

  # git archive master | gzip > v-1.25.tar.gz 

这将创build一个压缩的tar归档文件。 正如我们上面看到的,我们可以使用以

  # tar -xzf v-1.25.tar.gz 

你也可以使用:

  # git archive --format=zip master > v-1.25.zip # unzip v-1.25.zip 

更多信息:

g(un)zip通常不直接支持存档 – 只是压缩一个文件。 使用tar归档器然后gzip tar文件是最常见的。 我猜测,你用来压缩数据的gzip变体是注意到input是一个目录,并自动添加额外的步骤(并在解压缩时做同样的事情)。

试试tar -xvzf v1.25.gz或者gunzip v1.25.gz | tar -xv gunzip v1.25.gz | tar -xv
(如果您不想使用强制输出,则会从tar选项中删除v ,这会在提取文件时列出这些文件)
或者,如果你已经解压缩文件,你也可以尝试使用tar -xvf v1.25作为文件,如果我正确的猜测是tar文件。