如何在bash中将所有子目录中的所有文件gzip到一个压缩文件中

Posted

技术标签:

【中文标题】如何在bash中将所有子目录中的所有文件gzip到一个压缩文件中【英文标题】:How to gzip all files in all sub-directories into one compressed file in bash 【发布时间】:2012-09-02 03:15:36 【问题描述】:

可能重复:gzipping up a set of directories and creating a tar compressed file

This post 描述了如何在一个目录结构中单独压缩每个文件。但是,我需要做一些稍微不同的事情。我需要为某个目录下的所有文件生成一个大的 gzip 文件。我还需要能够为压缩文件(例如files.gz)指定输出文件名,如果已经存在,则覆盖旧的压缩文件文件。

【问题讨论】:

gzip 本质上只压缩一个文件。要将多个文件放在一个文件中以供后续 gzip 压缩,请使用 tar gzipping up a set of directories and creating a tar compressed file的可能重复 【参考方案1】:
tar -zcvf compressFileName.tar.gz folderToCompress

folderToCompress 中的所有内容都将转到 compressFileName

编辑:在审查和 cmets 之后,我意识到人们可能会对没有扩展名的 compressFileName 感到困惑。如果你愿意,你可以使用 .tar.gz 扩展名(如建议)和 compressFileName

【讨论】:

谢谢。这会压缩“folderToCompress”下的所有内容(即递归)吗? folderToCompress 中的所有内容都将转到 compressFileName 您可能想要选择 compressFileName,这样它就包含了 .tar.gz 扩展名,否则您会令其他人发疯。 这也适用于任意数量的目录,例如tar -zcvf two-dirs.tar.gz dir-one dir-two 将创建一个包含两个目录的存档。 还可以与* 一起压缩当前目录中的所有内容,即:tar -zcvf all.tar.gz *【参考方案2】:

有很多压缩方法可以在命令行中递归工作,很高兴知道最终受众是谁。

即如果要将其发送给运行 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 以及事情是如何被 tar 化/提取的,例如,如果我运行

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


pwd

/home/我的用户名

tar -xvzf passwd.tar.gz

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

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

 Removing leading `/' from member names

【讨论】:

【参考方案3】:

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

tar cvf - folderToCompress | gzip > compressFileName

要扩展存档:

zcat compressFileName | tar xvf -

【讨论】:

除了可移植之外,如果您想将参数传递给 gzip(例如,--test 或--best),此解决方案非常有用,因为 afaik 甚至 GNU tar 也无法提供将参数发送到 gzip。 这是通用的,因为您也可以使用其他压缩器。例如pigz,它更快,因为它可以更好地利用cpu(zip的多线程实现)。

以上是关于如何在bash中将所有子目录中的所有文件gzip到一个压缩文件中的主要内容,如果未能解决你的问题,请参考以下文章

Bash - 在文件之前列出所有子目录中的目录名称的程序

使用 bash,如何从目录中的所有文件中创建类路径?

如何在PHP中将所有文件和文件夹从一个目录移动到另一个目录?

将文件名中具有特定字符串的目录中的所有文件复制到Bash中的不同目录[关闭]

使用 'svn mv' 在 bash 中将目录中的每个文件大写

使用管道在 Perl 中将管道文件输出到 gzip 的 Python 等效项