将目录树压缩为多个 tar 存档到单个 xz

将目录树压缩为多个 tar 存档到单个 xz

我正在尝试压缩一个rootdir包含许多subdir_i文件夹树的大文件夹,如下所示:

./rootdir
./rootdir/subdir_1
./rootdir/subdir_2
...

我希望将其输出到单个压缩存档,但每个子目录都在它自己的 tar 存档中:

rootdir.tar.xz  # containing:
     subdir_1.tar
     subdir_2.tar

我已经尝试过以下操作:

for foo in `find rootdir -maxdepth 1 -name "subdir_*" -type d`
do
     tar --create --verbose --file=- --directory="rootdir" `basename ${foo}` 
     # in shorter form:  tar -cvf - -C rootdir subdir_i
done | xz -zc9 > rootdir.tar.xz 

它确实将子目录隔离到 xz 中,但内部只有一个 tar 存档,其中只有最后一个目录:

rootdir.tar.xz
     rootdir.tar # containing subdir_2/

然而,该存档的大小与整个树的压缩一致rootdir。有什么想法以及如何让它做我想做的事(不使用中间档案)?

答案1

您可以tar为每个目录创建文件,即 , directory-1.tar, directory-2.tar..., , directory-n.tar,然后创建包含所有部分的 tar 文件并通过 .zip 进行压缩tar Jcf whole-shebang.tar.xz directory-*.tar

当你可以的时候为什么要这么做tar Jcf whole-shebang.tar.xz directory-*?您当然可以从该毛球中提取单个目录/文件,在您的设置中,您必须首先提取特定的 tarball,然后在其中翻找以获得您想要的内容。

答案2

您实际上所做的是将所有焦油球连接起来。您可以使用 tar 的开关查看全部内容-i

$ tar -itvf rootdir.tar.xz
subdir_2/
subdir_1/

我认为不可能直接通过管道创建所有这些子目录焦油球的焦油球。您需要首先在循环中将它们写入磁盘:

for foo in `find rootdir -maxdepth 1 -name "subdir_*" -type d`
do
  tar --create --verbose --file=- --directory="rootdir" "$(basename ${foo})" \
  >"${foo}.tar"
done
tar -cf -  rootdir/subdir*.tar | xz -zc9 > rootdir.tar.xz
rm rootdir/subdir*.tar

相关内容