Extrai pasta específica do tarball para uma pasta específica

2

Eu criei um tarball no Ubuntu 14.04 com:

cd /tmp
tar -cfvz archive.tar.gz /folder

Agora quero extrair uma pasta específica no tarball (que dentro do tarball está em /tmp ) para uma pasta específica:

cd /tmp
tar -xfvz archive.tar.gz folder/in/archive -C /tmp/archive

O resultado deve ser uma nova pasta em /tmp chamada archive . Isso está correto? Especialmente a barra faltante (caminho relativo) para a pasta a ser extraída e o caminho absoluto com a barra inicial para a pasta criar?

    
por musbach 24.03.2016 / 09:23

2 respostas

6

Tl; dr

Como você já está em /tmp , é possível descartar a opção -C (já que por padrão tar extrairá arquivos no diretório de trabalho atual) e apenas --strip-components=2 :

tar --strip-components=2 -xfvz archive.tar.gz folder/in/archive

O GNU tar por padrão armazena os caminhos relativos.

Se um arquivo usa caminhos relativos pode ser verificado executando tar -tf archive | head -n 1 , que irá imprimir o caminho do primeiro arquivo no arquivo; Se o caminho desse arquivo é um caminho relativo, todos os arquivos no arquivo usam caminhos relativos:

% tar -tf bash-4.3.tar.gz | head -n 1
bash-4.3/

Para extrair um único arquivo / pasta de um arquivo que use caminhos relativos sem seus ancestrais em um caminho relativo, você precisará de duas opções: -C e --strip-components=N : no exemplo abaixo, o arquivo bash-4.3.tar.gz usa relativo caminhos e contém um arquivo bash-4.3/doc/bash.html que é extraído em um caminho relativo path ( -C especifica o diretório no qual os arquivos serão extraídos, --strip-components=2 especifica que o pai e o pai do pai dos arquivos extraídos devem ser ignorado, então, neste caso, apenas bash.html será extraído para o diretório de destino):

% tree
.
├── bash-4.3.tar.gz
└── path

1 directory, 1 file
% tar -tf bash-4.3.tar.gz | grep -F 'bash.html'
bash-4.3/doc/bash.html
% tar -C path --strip-components=2 -zxf bash-4.3.tar.gz bash-4.3/doc/bash.html
% tree
.
├── bash-4.3.tar.gz
└── path
    └── bash.html

1 directory, 2 files

Então, de volta ao seu comando, como você já está em /tmp , você pode descartar a opção -C (já que por padrão tar extrairá arquivos no diretório de trabalho atual) e apenas --strip-components=2 :

tar --strip-components=2 -xfvz archive.tar.gz folder/in/archive
    
por kos 24.03.2016 / 10:00
1

tar armazena caminhos relativos

Se você precisar extrair uma pasta específica, dê uma olhada no que está no arquivo tar:

tar -tvf archive.tar.gz

E anote o nome exato do arquivo.      tar -xvf foo.tar folder/in/archive
# Nota: nenhuma barra inicial

    
por daumie 24.03.2016 / 09:54