如何在Bash中将所有子目录中的所有文件压缩成一个压缩文件?

231

可能重复:
压缩一组目录并创建一个tar压缩文件

这篇文章描述了如何在目录结构中逐个gzip每个文件。然而,我需要做一些略微不同的事情。我需要为某个目录下的所有文件生成一个大的gzip文件。我还需要能够指定压缩文件的输出文件名(例如files.gz),并覆盖已经存在的旧压缩文件。


1
gzip 本质上只能压缩单个文件。如果要将多个文件放入一个文件中以便进行 gzipping,请使用 tar - Thomas
可能是重复问题:将一组目录压缩并创建一个tar压缩文件 - Cœur
3个回答

442
tar -zcvf compressFileName.tar.gz folderToCompress

所有位于folderToCompress文件夹中的内容都将被压缩到compressFileName中。

编辑:经过审核和评论,我意识到如果没有扩展名,compressFileName可能会让人感到困惑。如建议所述,可以使用.tar.gz扩展名并与compressFileName一起使用。


2
谢谢。这个会压缩“folderToCompress”下的所有内容(即递归地)吗? - Doug
2
所有位于folderToCompress文件夹中的内容都将被压缩到compressFileName中。 - amitchhajer
85
你可能会想要选择compressFileName,以便它包含.tar.gz扩展名,否则会让其他人发疯。 - drewish
9
这也适用于任意数量的目录,例如:tar -zcvf two-dirs.tar.gz dir-one dir-two 将创建一个包含两个目录的归档文件。 - Zoltán
6
也可以使用 * 来压缩当前目录下的所有内容,例如:tar -zcvf all.tar.gz * - user133408
显示剩余4条评论

68

有许多递归命令行工作的压缩方法,了解最终受众是很重要的。

例如,如果要发送给正在运行Windows的某人,则zip可能是最好的选择:

zip -r file.zip folder_to_zip

unzip filenname.zip

对于其他 Linux 用户或您自己,tar 是一个很棒的选择。

tar -cvzf filename.tar.gz folder

tar -cvjf filename.tar.bz2 folder  # even more compression

#change the -c to -x to above to extract

使用tar命令时,必须小心处理压缩和提取操作。例如,如果我执行以下命令:

cd ~
tar -cvzf passwd.tar.gz /etc/passwd
tar: Removing leading `/' from member names
/etc/passwd


pwd

/home/myusername

tar -xvzf passwd.tar.gz

这将创建/home/myusername/etc/passwd

不确定所有版本的tar是否会这样做:

 Removing leading `/' from member names

19

@amitchhajer的帖子适用于GNU tar。 如果有人发现这篇文章并需要在非GNU系统上工作,他们可以这样做:

tar cvf - folderToCompress | gzip > compressFileName

展开存档:

zcat compressFileName | tar xvf -

2
除了具有可移植性之外,如果您想将参数传递给gzip(例如--test或--best),则此解决方案非常有用,因为据我所知,即使GNU tar也没有提供发送参数到gzip的方法。 - Timothy Woods
这是多功能的,因为您还可以使用其他压缩器。例如,pigz 更快,因为它可以更好地利用 CPU(一种多线程实现的 zip)。 - Ortwin Angermeier

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接