从多个目录创建多个 tar.gz 存档

Create multiple tar.gz archives from multiple directories

我有一个目录里面全是项目,比方说/Users/Me/Projects

此文件夹内有多个子目录,其中一些子目录甚至更多。

我希望能够为 /Users/Me/Projects 中的每个存档创建一个 tar.gz 存档,其存档将与目录同名。

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

我想要的是 运行 一个脚本来遍历 Projects 中的目录,而不是创建下面的子目录 Project1.tar.gz, Project2.tar.gz, 和 Project3.tar.gz.

经过一些搜索和trial/error,我想出了这个脚本来以编程方式完成我想做的事情。

#! /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

再次回到我在问题中给出的例子,假设我想在我的 Documents 文件夹中创建档案,脚本看起来像这样。

#! /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. 给出的答案似乎是最直接的方法。我希望找到一种方法从新创建的存档名称中删除 spaces 以避免在其他文件系统上出现任何可能的问题,虽然我描述的方法确实删除了白色 space,但它有一个我 运行 遇到了一些障碍。

使用 GNU 查找:

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

没有find:

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

其中 */ 确保 glob 仅匹配目录,"${dir%/}" 删除目录名称的尾部斜杠。

如果有隐藏目录,*/不匹配;也得到那些,我们可以使用 shopt -s dotglob.