Comprimindo a árvore de diretórios em vários arquivos tar em um único xz

1

Estou tentando compactar um grande rootdir que contém muitos subdir_i da árvore de pastas:

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

Estou procurando produzir isso em um único arquivo compactado, mas tendo cada subdiretório em seu próprio arquivo tar:

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

Eu tentei o seguinte:

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 

Qual é o isolamento do subdiretório em um xz, mas um único arquivo tar está dentro com apenas o último diretório:

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

No entanto, o tamanho desse arquivo é consistente com a compactação de toda a árvore rootdir . Alguma idéia do porquê e como fazê-lo fazer o que eu quero (sem usar arquivos intermediários)?

    
por adjpayot 12.05.2017 / 16:41

1 resposta

0

O que você está realmente fazendo é concatenar todas as bolas de alcatrão. Você pode ver todo o conteúdo usando a opção -i do tar:

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

Eu não acho que é possível criar uma bola de alcatrão de todas essas bolas subdiretadas diretamente através de um cano. Você precisaria escrevê-los para o disco primeiro dentro do loop:

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
    
por 12.05.2017 / 17:24