Como você extrai uma única pasta de um grande arquivo tar.gz?

132

Estou usando este comando em um arquivo de 5 GB

tar -zxvf archive.tar.gz /folder/in/archive

esta é a maneira correta de fazer isso? Parece estar demorando uma eternidade sem saída de linha de comando ...

Garrett Hall
fonte
Você usou um caminho absoluto ou relativo? Deve ser relativo, diferente do que parece certo. Por quanto tempo você o deixou funcionar e qual o seu sistema? Levará pelo menos alguns minutos em uma máquina rápida. Potencialmente uma hora ou mais? Estou executando um teste agora.
21412 Kevin
Sim, foi concluído após ~ 1 hora, mas o caminho absoluto estava errado, você estava correto.
Garrett Hall
5
No Linux, você pode assistir o quão longe no arquivo taré com cat /proc/$(pidof tar)/fdinfo/0(adaptar o comando se você tiver mais de um tarprocesso em execução).
Gilles
A parte importante também não é barra final. Usar folder/folder2/não funcionará.
Marki555

Respostas:

145

tararmazena caminhos relativos por padrão . O tar do GNU diz isso se você tentar armazenar um caminho absoluto:

tar -cf foo.tar /home/foo
tar: Removing leading `/' from member names

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

tar -tvf foo.tar

E anote o nome do arquivo exato. No caso do meu foo.tararquivo, eu poderia extrair /home/foo/bardizendo:

tar -xvf foo.tar home/foo/bar # Note: no leading slash

Portanto, não, a maneira como você postou não é (necessariamente) a maneira correta de fazê-lo. Você tem que deixar de fora a barra principal. Se você deseja simular caminhos absolutos, faça cd /primeiro e verifique se você é o superusuário. Além disso, isso faz o mesmo:

tar -C / -xvf foo.tar home/foo/bar # -C is the ‘change directory’ option

Existem razões muito óbvias e boas pelas quais tarconverte caminhos em caminhos relativos. Uma é a capacidade de restaurar um arquivo em outros locais que não sua fonte original. O outro é segurança. Você pode extrair um arquivo morto, esperar que seus arquivos apareçam no seu diretório de trabalho atual e substituir os arquivos do sistema (ou seu próprio trabalho) em outro lugar por engano.

Nota: se você usar a -Popção, tar irá arquivar caminhos absolutos. Por isso, sempre vale a pena verificar o conteúdo de grandes arquivos antes de extrair.

Alexios
fonte
36
--strip-components=Npode ser útil para alguns aqui.
Acumenos
2
no meu caso, era necessário escrever ./foldername/em vez de foldername, eu acho que era porque quando eu criei o alcatrão que eu criei com tar -cvf santi.tar ./*e quando eu "listados" o alcatrão é isso que ele dissedrwxr-xr-x santi/santi 0 2016-04-11 09:42 ./foldername/
santiago Arizti
11
E sobre .gz?
Peter Krauss
11
O @PeterKrauss muda -xvfpara -xzvf(adicionando a -zopção) e obviamente foo.tarpara foo.tar.gzou o nome do seu arquivo. O mesmo vale para -j(bz2) e em algumas versões recentes, -J(xz). Caso contrário, um pipeline como zcat foo.tar.gz | tar -xvf - …também funciona.
Alexios #
E lembre-se, se você está cansado de toda a saída detalhada durante a extração, pule a vem todos os exemplos. Por exemplo, tar -tf foo.tare tar -xf foo.tar ....
Bo R