我可以使用 gzip 压缩整个文件夹吗?

use*_*502 489 zip gzip

我正在尝试在 unix 中压缩一个文件夹。可以使用 gzip 命令完成吗?

Sha*_*dur 801

不。

与此不同zip仅用gzip作压缩算法。

由于种种原因,其中一些倾听回磁带驱动器的时代,Unix的使用命名的程序tar来归档数据,然后可以用压缩程序等压缩gzipbzip27zip,等。

为了“压缩”一个目录,正确的命令是

tar -zcvf archive.tar.gz directory/ 
Run Code Online (Sandbox Code Playgroud)

这将告诉tar

  • 使用z (gzip) 算法压缩它

  • c(创建)从directory(tar默认情况下是递归的) 中的文件创建一个存档

  • v(详细地)列出(在 /dev/stderr 上,因此它不会影响管道命令)它添加到存档中的所有文件。

  • 并将输出存储为名为的f(文件)archive.tar.gz

tar命令提供gzip支持(通过-z标志)纯粹是为了您的方便。的gzip命令/ lib中是完全分开的。上面的命令实际上与

tar -cv directory | gzip > archive.tar.gz
Run Code Online (Sandbox Code Playgroud)

要将存档解压缩并解压到您将使用的当前目录中

tar -zxvf archive.tar.gz
Run Code Online (Sandbox Code Playgroud)

该命令实际上与

gunzip < archive.tar.gz | tar -xv
Run Code Online (Sandbox Code Playgroud)

tar还有很多很多其他的选择和用途;我衷心建议您在某个时间阅读它的联机帮助页。

  • 为了使事情更加明确,这与`tar -cv directory | 完全相同。gzip &gt; archive.tar.gz`。然后可以使用`tar -zxvf` 甚至`zcat file.tar.gz | 提取生成的存档文件。焦油-xv`。重点是 tar 完全独立于 gzip,为了方便起见,`tar` 命令只包含 gzip 支持。 (58认同)
  • @hello_there_andy 这对大多数unix 没有区别,但windows(和linux 中的智能选项卡完成)会根据文件扩展名做出假设。 (4认同)
  • @vadimkotov 这可能就是你要找的:https://superuser.com/questions/168749/is-there-a-way-to-see-any-tar-progress-per-file/168756 (2认同)

slm*_*slm 57

gzip使用-r开关时,该命令不会将目录递归压缩为单个 zip 文件。相反,它将遍历该目录结构并将它找到的每个文件压缩到一个单独的文件中。

例子

$ tree dir1/
dir1/
|-- dir11
|   |-- file11
|   |-- file12
|   `-- file13
|-- file1
|-- file2
`-- file3
Run Code Online (Sandbox Code Playgroud)

现在运行gzip命令

$ gzip -r dir1
Run Code Online (Sandbox Code Playgroud)

$ tree dir1/
dir1/
|-- dir11
|   |-- file11.gz
|   |-- file12.gz
|   `-- file13.gz
|-- file1.gz
|-- file2.gz
`-- file3.gz
Run Code Online (Sandbox Code Playgroud)

如果您更喜欢压缩目录结构,那么您可能需要使用该tar命令,然后压缩生成的.tar文件。

$ tar zcvf dir1.tar.gz dir1/
Run Code Online (Sandbox Code Playgroud)

例子

$ tar zcvf dir1.tar.gz dir1/
dir1/
dir1/file1
dir1/file2
dir1/dir11/
dir1/dir11/file11.gz
dir1/dir11/file12.gz
dir1/dir11/file13.gz
dir1/file3
Run Code Online (Sandbox Code Playgroud)

这导致以下单个文件:

$ ls -l | grep tar
-rw-rw-r-- 1 saml saml  271 Oct  1 08:07 dir1.tar.gz
Run Code Online (Sandbox Code Playgroud)

您可以确认其内容:

$ tar ztvf dir1.tar.gz 
drwxrwxr-x saml/saml         0 2013-10-01 08:05 dir1/
-rw-rw-r-- saml/saml         0 2013-10-01 07:45 dir1/file1
-rw-rw-r-- saml/saml         0 2013-10-01 07:45 dir1/file2
drwxrwxr-x saml/saml         0 2013-10-01 08:04 dir1/dir11/
-rw-rw-r-- saml/saml        27 2013-10-01 07:45 dir1/dir11/file11.gz
-rw-rw-r-- saml/saml        27 2013-10-01 07:45 dir1/dir11/file12.gz
-rw-rw-r-- saml/saml        27 2013-10-01 07:45 dir1/dir11/file13.gz
-rw-rw-r-- saml/saml         0 2013-10-01 07:45 dir1/file3
Run Code Online (Sandbox Code Playgroud)


小智 13

问题“我可以使用 gzip [在 linux] 压缩整个文件夹吗?”的答案 是您可以使用该zip程序代替 gzip,其语法如下:

zip -r <zip file name> <folder to zip>
Run Code Online (Sandbox Code Playgroud)

  • 当问题指定......“使用gzip”时,这很棘手。 (3认同)
  • @JeffSchaller:这是一个答案。这是一个严重错误的(我相信),但它显然是一个答案。 (2认同)
  • 像所问的问题一样使用 zip 的要点,很可能作者想知道可以像以前在 Windows 上做的那样做完全相同的事情。可悲的是,大多数人不想考虑这么远。 (2认同)
  • 我赞成这个答案,因为我认为产品(zip 文件)可能比方法(使用 gzip)更重要。 (2认同)

lep*_*epe 5

我编写了这两个命令:

gzipdir

#!/bin/bash
if [[ -d $1 ]]; then
    cd "$1"
    cd ..
    base=$(basename "$1")
    tar -zcvf "$base.tgz" "$base"
    if [[ $? == 0 && -f "$base.tgz" ]]; then
        rm -rf "$base"
    fi
else
    echo "Usage: $0 DIRECTORY";
fi
Run Code Online (Sandbox Code Playgroud)

ungzipdir

#!/bin/bash
if [[ -f $1 ]]; then
    base=${1%%.*}
    file=$(basename "$1");
    dir=$(basename "$base");
    if [[ ! -d $base ]]; then
        mkdir "$base"
        cd "$base"
        cd ..
        tar -xvf "$file"
        if [[ $? == 0 && -d "$dir" ]]; then
            rm -f "$file"
        fi
    else
        echo "Directory $base already exists. Nothing done."
    fi
else
    echo "Usage: $0 file.tgz";
fi
Run Code Online (Sandbox Code Playgroud)

(!!!) 请在使用前进行测试(因为有一个“rm -f”,如果以不常见的方式使用,它可能会删除重要数据)。

如何使用:

cd /home/; gzipdir MyDirectory 或者 gzipdir /home/MyDirectory

将创建 /home/MyDirectory.tgz 并在成功时删除 MyDirectory (!!!)。

ungzipdir /home/MyDirectory.tgz

将创建 /home/MyDirectory 并在成功时删除 /home/MyDirectory.tgz。