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-*
?もちろん、そのタールボールから個々のディレクトリ/ファイルを抽出することもできます。設定から特定のタールボールを最初に抽出し、必要なものを取得するにはその中で掘り下げる必要があります。
答え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