use tar para extrair e compactar imediatamente os arquivos do tarball

3

Eu tenho um tarball compactado (por exemplo, foo.tar.gz ) do qual eu desejo extrair todos os arquivos, mas os arquivos dentro do tarball não são compactados. Ou seja, o conteúdo de foo.tar.gz são arquivos txt não compactados.

Não há espaço suficiente no meu sistema de arquivos para extrair os arquivos diretamente, portanto, desejo extrair esses arquivos e compactá-los imediatamente à medida que eles são gravados no disco. Eu não posso simplesmente extrair os arquivos e, em seguida, extrair os arquivos extraídos porque, como eu disse, não há espaço suficiente no sistema de arquivos. Também gostaria de garantir que os nomes de arquivos originais, incluindo seus diretórios, sejam preservados fielmente no disco. Então, se um dos arquivos no tarball for /a/b/c/foo.txt , no final do processo, eu gostaria de ter /a/b/c/foo.txt.gz

Como posso conseguir isso?

    
por John Dibling 25.04.2015 / 19:26

1 resposta

4

Não será rápido, especialmente para um tarball grande com muitos arquivos, mas no bash você pode fazer isso:

tar -tzf tarball.tgz | while IFS= read -r file; do
    tar --no-recursion -xzf tarball.tgz -- "$file"
    gzip -- "$file"
done

O primeiro comando tar extrai os nomes dos arquivos no tarball e passa esses nomes para um loop while read ... . O nome do arquivo é então passado para um segundo comando tar que extrai apenas esse arquivo , que é então compactado antes que o próximo arquivo seja extraído. O --no-recursion flag é usado, portanto, tentar extrair um diretório não extrai todos os arquivos desse diretório, que é o que o tar faria normalmente.

Você ainda precisará de espaço livre suficiente para armazenar um pouco mais do que o tamanho original do tarball compactado.

    
por 25.04.2015 / 21:14

Tags