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

评论

您可以使用gzip -r myfolder,它将递归gzip文件。您可以使用gunzip -r myfolder解压缩文件的相同方法,该方法将递归解压缩文件。有关更多信息,请参见man gzip

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

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

@Shadur这就是为什么我将其发布为评论,因为这不是他的问题的答案。

演示@Shadur的含义。给定文件夹“ 1”和“文件夹2”下的文件。 gzip -r ./playground将为您在Playground文件夹下提供1.gz和2.gz(以及更多的1和2个文件),而不是包含所有内容的压缩文件。

#1 楼

否。

zip不同,gzip只能用作压缩算法。

由于各种原因,其中一些原因可以追溯到磁带驱动器时代,Unix使用名为tar存档数据,然后可以使用gzipbzip27zip等压缩程序压缩数据。

为了“压缩”目录,正确的命令应为br />
tar -zcvf archive.tar.gz directory/ 


,这将告诉tar使用z(gzip)算法对其进行压缩
c(创建)来自directory中的文件(默认情况下tar是递归的)
v(详细地)列出(在/ dev / stderr上,因此不会影响管道命令)所有添加到存档中的文件。
并存储输出为名为archive.tar.gz的af(文件)

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

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


要将压缩文件解压缩并解压缩到当前目录中,您可以使用

tar -zxvf archive.tar.gz


该命令实际上与
gunzip < archive.tar.gz | tar -xv

tar还有很多很多其他选项和用法;我衷心建议您一定要通读其手册。

评论


为了使事情更明确,这与tar -cv目录完全等效。 gzip> archive.tar.gz。然后可以使用tar -zxvf甚至zcat file.tar.gz提取生成的存档。 tar -xv。要点是tar完全独立于gzip,tar命令仅包括gzip支持以方便使用。

–干粉
13-10-2在0:16



我已经使用tar cvzf了很长时间了。需要注意的一件事:如果您使用Windows(指定为7-zip)解压缩* .tar.gz文件,则需要进行两轮操作。一种将* .tar.gz文件解压缩为* .tar文件,另一种将tar文件解压缩为原始内容。这会增加总的解压缩时间,尤其是对于大文件(例如日志)

–萧
16-10-5在12:11



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

– hello_there_andy
17年2月9日在15:58

@hello_there_andy它对大多数unix没有影响,但是Windows(和Linux中的智能制表符完成)将基于文件名扩展名做出假设。

– Shadur
17年2月9日在16:00

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

– Shadur
18年3月19日在13:56

#2 楼

使用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


#3 楼

对“我可以在Linux上使用gzip压缩整个文件夹吗?”问题的答案。是您可以使用zip程序代替gzip,其语法为:
zip -r <zip file name> <folder to zip>


评论


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

–斯科特
17-10-12在18:42

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

– dhag
17-10-12在18:46

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

–弗洛里安·海格尔(Florian Heigl)
18年4月15日在19:49



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

– Jeff Schaller♦
18年4月15日在20:57

我赞成这个答案,因为我认为产品(一个zip文件)比方法(使用gzip)更重要。

– andyvanee
19年3月3日在18:02

#4 楼

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

gzipdir

#!/bin/bash
if [[ -d  ]]; then
    cd ""
    cd ..
    base=$(basename "")
    tar -zcvf "$base.tgz" "$base"
    if [[ $? == 0 && -f "$base.tgz" ]]; then
        rm -rf "$base"
    fi
else
    echo "Usage: 
#!/bin/bash
if [[ -f  ]]; then
    base=${1%%.*}
    file=$(basename "");
    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: q4312078q file.tgz";
fi
DIRECTORY"; fi


ungzipdir

q4312078q

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

如何使用:

cd /home/; gzipdir MyDirectorygzipdir /home/MyDirectory

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

评论


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

– andrew lorien
17-6-29在5:49



#5 楼

我建议使用pigz(GZip的并行实现)

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

评论


我也经常使用它(和pixz),但是当管道和输出重定向起作用时,它可以工作吗?

–迈克尔·沃尔夫(Michael Wolf)
18/12/19在23:38

#6 楼

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

tar -cvf - dir | gzip > dir.tar.gz


#7 楼

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

tar -zcvf archive.tar.gz directory/ &