Como extrair arquivos específicos do tar.gz

106

Como podemos extrair arquivos específicos de um arquivo tar.gz grande? Encontrei o processo de extração de arquivos de um tar nesta pergunta , mas quando tentei o comando mencionado lá, recebi o erro:

$ tar --extract --file={test.tar.gz} {extract11}
tar: {test.tar.gz}: Cannot open: No such file or directory
tar: Error is not recoverable: exiting now

Como então extraio um arquivo tar.gz?

Ankit Vashistha
fonte
Observe que qualquer solução deve primeiro descompactar todo o arquivo morto : superuser.com/questions/655739/… Se você quiser evitar isso, precisará usar outro formato, como zip. No entanto, o ZIP fornecerá menos compactação, pois compactará um arquivo individual separadamente: superuser.com/questions/1013309/… Gostaria de saber se existe um formato que suporta velocidade e capacidade de extrair um único arquivo.
Ciro Santilli 事件 改造 中心 法轮功 六四 事件

Respostas:

120

Você também pode usar tar -zxvf <tar filename> <file you want to extract>

Você deve escrever o nome do arquivo exatamente como tar ztf test.tar.gzmostra. Se diz ./extract11, por exemplo , ou some/bunch/of/dirs/extract11, é isso que você precisa fornecer (e o arquivo será exibido exatamente com esse nome, os diretórios necessários serão criados automaticamente).

  • -x: instrui o tar a extrair arquivos.
  • -f: especifica o nome do arquivo / tarball.
  • -v: Detalhado (mostra o progresso ao extrair arquivos).
  • -z: filtre o arquivo morto pelo gzip, use para descompactar arquivos .gz.
harish.venkat
fonte
$ tar -zxvf test.tar.gz extract11 tar: extract11: Not found in archive tar: Error exit delayed from previous errors
Ankit Vashistha
1
em seguida, tentar este tar tf archive.tar.gz | grep extract11.please verificar se extract11 é no arquivo ou não
harish.venkat
8
Você deve escrever o nome do arquivo exatamente como tar ztf test.tar.gzmostra. Se diz ./extract11, por exemplo , ou some/bunch/of/dirs/extract11, é isso que você precisa fornecer (e o arquivo será exibido exatamente com esse nome, os diretórios necessários serão criados automaticamente).
precisa saber é o seguinte
Gostaria de acrescentar um ponto aqui, a -zopção não funciona em algumas versões do unix como o HP-UX.
Ankit Vashistha
1
@ pj-brunet: Não, fnão deve estar no final. Mas deve ser seguido diretamente pelo nome do arquivo. Este exemplo com todas as outras opções após o nome tar funciona bem: tar -f mytar.tar.gz -zxv dir/somefile. Extrai "dir / somefile" de "mytar.tar.gz".
mivk 13/01
34

Vamos supor que você tenha um tarball chamado lotsofdata.tar.gze você apenas saiba que existe um arquivo que deseja, mas tudo que você pode lembrar é que o nome dele contém a palavra contract. Você tem duas opções:

Use tare greppara listar o conteúdo do seu tarball, para descobrir o caminho completo e o nome de qualquer arquivo que corresponda à parte que você conhece e, em seguida, use tarpara extrair esse arquivo agora que você conhece os detalhes exatos ou use dois As opções pouco conhecidas apenas extraem todos os arquivos que correspondem ao pouco que você sabe sobre o nome do arquivo - você não precisa saber o nome completo ou parte do caminho dessa opção. Os detalhes são:

Opção 1

$ tar -tzf lotsofdata.tar.gz | grep contract

Isso listará os detalhes de todos os arquivos cujos nomes contêm sua parte conhecida. Então você extrai o que deseja usando:

$ tar -xzf lotsofdata.tar.gz <full path and filename from your list above>

Você pode precisar ./na frente do seu caminho para que ele funcione.

opção 2

$ tar -xzf lotsofdata.tar.gz --wildcards --no-anchored '*contract*'

Depende de você que você achar mais fácil ou mais útil.

Wendy Cricks
fonte
Drat. Um erro de digitação no último comando: eu duplicei -xzf. Deve haver apenas uma instância dessas opções.
Wendy Cricks
tar -xzf lotsofdata.tar.gz <full path and filename from your list above>funcionou para mim com as nossas doações ./no início do caminho completo
#
Você pode ter que ser paciente com isso, demorou um pouco ... Talvez também seja óbvio, mas extrairá a estrutura de diretório completa no diretório atual, mesmo que esses diretórios ainda não existam.
PJ Brunet
O tar BSD (pelo menos no macOS) não suporta a --wildcardsopção. Eu ainda era capaz de ter um comportamento semelhante -x -O *foo. *foofoi o nome do arquivo glob no meu caso, pois eu sabia que o arquivo terminava com foo.
Eric Hu
6

Eu estava tentando extrair algumas centenas de arquivos de um tarball com milhares de arquivos no outro dia. Os arquivos necessários não podem ser referenciados por um único curinga. Então, pesquisei no Google e encontrei esta página.

No entanto, nenhum dos truques acima parece bom para minha tarefa. Acabei lendo o homem e encontrei essa opção --files-from, então minha solução final é

gunzip < thousands.tar.gz | tar -x -v --files-from hundreds.list -f -

E funciona como um encanto.

Atualização: o arquivo de lista deve ter o mesmo formato que você veria tar -tvf, caso contrário, você não poderá extrair nenhum arquivo.

JJ Tang
fonte
2

Seu exemplo funciona para mim se você omitir o aparelho

$ tar --extract --file=test.tar.gz extract11

Se o seu arquivo extract11 estiver em uma subpasta, você deve especificar o caminho dentro do tarball.

$ tar --extract --file=test.tar.gz subfolder/extract11
Bernhard
fonte
$ tar --extract --file=test.tar.gz extract11 tar: extract11: Not found in archive tar: Error exit delayed from previous errors
Ankit Vashistha
Obviamente extract11 não está no arquivo tar. Certifique-se de que você precisa fornecer o caminho relativo. Veja edição
Bernhard
1

Por favor, encontre abaixo os exemplos de extração de arquivos específicos do arquivo tar.gz.

Do arquivo local:

$ tar xvf file.tgz path/README.txt 2nd_file.txt

Do URL remoto:

$ curl -s http://example.com/file.tgz | tar xvf - path/README.txt 2nd_file.txt
kenorb
fonte