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


407

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


6
您可以使用gzip -r myfolder它将递归gzip文件。您可以使用解压缩文件的相同方法来gunzip -r myfolder 递归解压缩文件。有关更多信息, man gzip
Valentin Bajrami 2013年

12
使用tar; 它支持压缩选项。 gzip被设计为对的补充tar,而不是替代。
devnull

13
请注意,@ val0x00ff的建议几乎肯定不是您想要完成的。
2013年

4
@Shadur这就是为什么我发布它,comment因为那不是他问题的答案。
Valentin Bajrami 2013年

2
演示@Shadur的含义。给定文件12位于文件夹下playgroundgzip -r ./playground会给你1.gz2.gz(并没有更多12文件)文件夹下playground,不与它的一切一个压缩文件。
杰夫·肖

Answers:


660

没有。

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

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

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

tar -zcvf archive.tar.gz directory/ 

这将告诉tar

  • 使用z(gzip)算法对其进行压缩

  • c(根据)directorytar中的默认设置是递归的)文件中的一个创建存档

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

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

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

tar -cv directory | gzip > archive.tar.gz

要将存档解压缩并解压缩到当前目录,请使用

tar -zxvf archive.tar.gz

该命令实际上与

gunzip < archive.tar.gz | tar -xv

tar还有很多很多其他选择和用途;我衷心建议您一定要通读其联机帮助页。


51
只是为了使事情更加明确,这与完全等价tar -cv directory | gzip > archive.tar.gz。然后可以使用tar -zxvf甚至提取生成的存档zcat file.tar.gz | tar -xv。要点是tar完全独立于gzip,该tar命令仅包含gzip支持以方便使用。
帕特里克

我已经使用tar cvzf了一段时间了。需要注意的一件事:如果使用Windows(7-zip需指定)解压缩*.tar.gz文件,则需要两轮操作。一种将*.tar.gz文件解压缩到*.tar文件中,另一种将tar文件解压缩到原始内容中。它增加了总解压缩时间,尤其对于大文件(例如日志)
杰夫·肖

1
归档文件的命名是否会影响任何机器方面的内容?我知道让人们知道最初用于压缩它的算法会很高兴(因此.gz),但是除此之外,您如何命名存档实际上并不重要吗?
hello_there_andy

3
@hello_there_andy它与大多数unix没有什么区别,但是Windows(和Linux中的智能制表符补全)将基于文件名扩展名做出假设。
Shadur

1
@vadimkotov这可能是您在寻找的东西:superuser.com/questions/168749/…–
Shadur

47

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

之前

$ tree dir1/
dir1/
|-- dir11
|   |-- file11
|   |-- file12
|   `-- file13
|-- file1
|-- file2
`-- file3

现在运行gzip命令

$ gzip -r dir1

$ tree dir1/
dir1/
|-- dir11
|   |-- file11.gz
|   |-- file12.gz
|   `-- file13.gz
|-- file1.gz
|-- file2.gz
`-- file3.gz

如果您希望压缩目录结构,则可能需要使用该tar命令,然后压缩生成的.tar文件。

$ tar zcvf dir1.tar.gz dir1/

$ 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

这将导致以下单个文件:

$ ls -l | grep tar
-rw-rw-r-- 1 saml saml  271 Oct  1 08:07 dir1.tar.gz

您可以确认其内容:

$ 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

4

我编写了以下两个命令的脚本:

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

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

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

如何使用:

cd /home/; gzipdir MyDirectory 要么 gzipdir /home/MyDirectory

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

ungzipdir /home/MyDirectory.tgz

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


要压缩目录中的所有文件:(请 find ./* -maxdepth 0 -type d -exec gzipdir {} \; 谨慎使用find命令,-exec echo {}首先对其进行测试,并确保您未捕获将压缩PARENT目录的“ ./”,这可能会破坏整个主目录)
安德鲁·洛里安(Andrew lorien)

1

我建议使用pigz并行实现GZip

tar -cvf - dir | pigz -9 > /path/to/dir.tar.gz


我也经常使用它(和pixz),但是当管道和输出重定向起作用时,它是否起作用?
Michael Wolf

1

问题“我可以在Linux上使用zip压缩整个文件夹吗?”的答案是使用以下语法:

zip -r <zip file name> <folder to zip>

如果您有新问题,请单击“ 提问”按钮提问。如果它有助于提供上下文,请包括指向该问题的链接。- 评论
杰夫·谢勒

2
@JeffSchaller:这是一个答案。这是一个非常错误的错误(我相信),但这显然是一个答案。
斯科特,

1
@ize:我敢肯定您发布的命令实际上并没有使用gzip。
dhag

1
使用zip的问题之类的问题,最有可能的是作者希望知道可以像以前在Windows上一样做完全一样的事情。可悲的是,大多数人不愿这么想。
Florian Heigl '18

2
当问题指定...“使用gzip”时,这很棘手。
杰夫·

1

为了完整起见,如果要在后台将文件压缩,请使用@Shadur的答案并&在末尾附加:

tar -zcvf archive.tar.gz directory/ &

0

如果您的linux tar不支持该-z选项,则可以使用以下命令:

tar -cvf - dir | gzip > dir.tar.gz
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.