GZIP 无法解压为目录

GZIP 无法解压为目录

我正在尝试压缩一个文件夹,以便可以通过 FTP 将其传输到我的网络服务器。

我在 osx snow leopard 上压缩,在 ubuntu 8.04 上解压

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

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

sudo gunzip v1.25.gz 

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

我究竟做错了什么?

答案1

如果您来自 Windows 世界,那么您习惯使用 zip 或 rar 等工具来压缩文件集合。按照典型的 Unix 传统,只做一件事,做好一件事,您往往会有两个不同的实用程序:一个压缩工具和一个存档格式。然后人们将这两个工具一起使用,以提供与 zip 或 rar 相同的功能。

压缩格式有很多种;目前 Linux 上常用的压缩格式有 gzip(有时称为 zlib)和性能更高的新式 bzip2。遗憾的是,bzip2 占用更多 CPU 和内存来提供更高的压缩率。您可以使用这些工具来压缩任何文件,按照惯例,这两种格式压缩的文件都是 .gz 和 .bz2。您可以使用 gzip 和 bzip2 来压缩,使用 gunzip 和 bunzip2 来解压这些格式。

还有几种不同类型的存档格式可用,包括 cpio、ar 和 tar,但人们往往只使用 tar。这些格式允许您将多个文件打包成一个文件。它们还可以包含路径和权限信息。您可以使用 tar 命令创建和解压 tar 文件。您可能会听到这些操作被称为“tarring”和“untarring”。(该命令的名称来自 Tape ARchive 的缩写。Tar 是对 ar 格式的改进,因为您可以使用它来跨多个物理磁带进行备份)。

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

这将创建 (-c) 并将文件存档到名为 archive.tar 的文件 -f 中。(.tar 是 tar 存档的常规扩展名)。现在您应该有一个包含五个文件(“list”、“of”、“files”、“to”和“include”)的文件。如果您为 tar 指定一个目录,它将递归到该目录并将所有内容存储在其中。

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

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

  # tar -tf archive.tar

在提取内容之前获取其列表。

所以现在您可以结合这两个工具来复制 zip 的功能:

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

您现在将有一个 archive.tar.gz 文件。您可以使用以下命令提取它:

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

我们可以使用管道来节省中间的 archive.tar:

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

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

我们可以做得更好一些,因为,稍微明显地打破了“一项工作做好”的理念,tar 能够使用 -z 参数压缩其输出并解压缩其输入(我说明显,因为它仍然在后台使用 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 archive 可以创建 tar 文件或 zip 文件。默认情况下,它会创建一个 tar 文件。

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

这将创建一个压缩的 tar 存档。如上所示,我们可以使用以下命令提取它:

 # tar -xzf v-1.25.tar.gz

您还可以使用:

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

更多信息:

答案2

g(un)zip通常不直接支持归档 - 仅支持单个文件的压缩。最常见的是使用tar归档器,然后使用gziptar 文件。我猜gzip你用来压缩数据的变体会注意到输入是一个目录并自动添加额外的步骤(并在解压缩时执行相同操作)。

尝试tar -xvzf v1.25.gzgunzip v1.25.gz | tar -xv
(如果您不想要详细输出,请从 tar 选项中删除v,其中列出了提取的文件)
或者如果您已经解压了文件,您也可以尝试tar -xvf v1.25,因为如果我猜得没错的话,该文件应该是档案tar

相关内容