我正在尝试压缩一个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