从多个目录创建多个tar.gz归档文件

3

我有一个项目目录,比如说/Users/Me/Projects

这个文件夹里面有多个子文件夹,有些子文件夹中还有更多的子文件夹。

我希望能够在/Users/Me/Projects目录下创建每个目录的tar.gz归档文件,这些归档文件的名称与目录名称相同。

例如,在Projects文件夹中,我有Project1Project2Project3

我想要运行一个脚本来循环遍历Projects目录中的目录,而不是其下面的子目录,以创建Project1.tar.gzProject2.tar.gzProject3.tar.gz

3个回答

3

使用GNU find命令:

cd /Users/Me/Projects
find . -maxdepth 1 -mindepth 1 -type d -exec tar -cvzf {}.tgz {} \;

3

没有find

for dir in */; do tar -czvf "${dir%/}".tar.gz "$dir"; done

*/ 确保通配符仅匹配目录,而 "${dir%/}" 则从目录名称中删除尾部斜杠。

如果有隐藏的目录,则不会被 */ 匹配;为了获取这些目录,我们可以使用 shopt -s dotglob


谢谢您的回答。我有一个问题,如何更改此脚本以在除原始目录所在位置之外的其他位置输出新创建的档案? 我要从其中大多数扩展目录中创建这些档案的外部硬盘,我想将档案放置在内部硬盘上。它会像这样吗:例如,for dir in */; do tar -czvf /Users/Username/Archives/"${dir%/}".tar.gz "$dir"; done - jzg.dev
@jzg.dev 没错!如果您不确定一个命令的作用,您可以在它前面插入 echo,然后查看将在删除它时执行的命令,而无需实际执行它们:for dir in */; do echo tar ... - Benjamin W.
1
感谢您的帮助!:) - jzg.dev

1

经过一些搜索和试错,我想出了这个脚本来实现我想做的事情。

#! /bin/sh

    for dir in `find . -maxdepth 1 -mindepth 1 -type d | sed 's|./||'`
    do
        tar -czvf /Path/To/Place/Created/Archives/$dir.tar.gz /Path/To/Directories/$dir;
    done

根据我在问题中给出的示例,假设我想在我的文档文件夹中创建存档,那么脚本将如下所示。

#! /bin/sh

    for dir in `find . -maxdepth 1 -mindepth 1 -type d | sed 's|./||'`
    do
        tar -czvf /Users/Me/Documents/$dir.tar.gz /Users/Me/Projects/$dir;
    done

编辑

经过进一步的研究,似乎Benjamin W.提供的答案是最直接的方法。我希望找到一种方式,可以从新创建的存档名称中删除空格,以避免在其他文件系统上可能出现的任何问题,虽然我描述的方法确实可以去除空格,但我遇到了一些问题。


1
恭喜你找到了自己的答案,但是不要阅读带有for的行 - Etan Reisner
如果你使用-print0 | xargs -0 tar ...,就不需要在末尾使用sed。这将是一个非常好的答案。 - Jason Hu

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