Como posso remover o caminho inicial de um tar e retar na memória?

7

Eu estava pensando que poderia fazer algo assim:

wget -O- http://example.com/funky.tar.gz | \
  tar --strip-components 1 -Ox | tar -cf fixed.tar.gz

para remover o caminho principal de todos os itens no tar baixado, mas parece que não há como criar um tar de stdin. Por favor, prove-me errado.

    
por Michael Hale 15.03.2010 / 06:32

3 respostas

2

Você certamente pode criar um tar de stdin. Use - como a fonte e canalize o que você quiser para isso.

link

link

    
por 15.03.2010 / 06:39
2

O módulo tarfile do Python oferece suporte a leitura e gravação de fluxo. Você pode obter o resultado de TarFile.extractfile() de um arquivo tar e alimentá-lo diretamente em TarFile.addfile() de um segundo arquivo. Obviamente, isso exigiria um pouco de programação, mas faria o que você pedir.

    
por 02.05.2010 / 03:05
0

Parece-me que alguém poderia descrever o que você quer como um "editor de fluxo" para arquivos tar que permite aplicar a tradução do nome --strip-components . A idéia é pegar um arquivo tar como entrada e escrever um arquivo tar modificado como saída.

Nenhum dos tar s cuja documentação eu verifiquei ( GNU tar , estrela , bsdtar ) parece apoiar sua operação exata .

bsdtar é interessante. Sua sintaxe @archive parece que está perto de permitir que você leia um arquivo tar e escreva um modificado, mas a entrada manpage para --strip-components diz que ele só funciona nos modos x e t ). Se funcionasse no modo c , você poderia usar algo assim:

wget -O - <url> | bsdtar -c --strip-components 1 -zf new.tar.gz @-

Eu não tenho bsdtar na minha máquina (é tar no FreeBSD , bem como tar no Mac OS X 10.6 (versões mais antigas usam o GNU tar ); ele está disponível como bsdtar em algumas distribuições Linux: Debian GNU / Linux , Ubuntu e algumas distribuições baseadas em RPM , mas olhando para o código, estou certo de que a invocação apenas causará um erro "Opção - não se permite que os componentes da plataforma sejam permitidos no modo -c".

Se você quiser isso, provavelmente terá que criar seu próprio programa (ou pedir a alguém para fazer isso por você). Felizmente, isso pode não ser tão difícil quanto parece. O bsdtar baseia-se na muito bacana biblioteca libarchive . Parece que seria bastante simples criar um programa que faz o que você quer. Como o bsdtar já possui a maior parte do código que você precisa para copiar um arquivo para outro (através do @archive handling), você provavelmente poderia adicionar algumas funcionalidades ao bsdtar . Uma abordagem simples de "dane-se a arquitetura, apenas faça-o" pode ser ativar --strip-components para o modo c e adicionar uma chamada a edit_pathname dentro de append_archive . O problema dessa abordagem é que todas as transformações de edit_pathname seriam aplicadas a ambas as entradas de @archive s e os nomes de caminho dos arquivos reais especificados por outros meios (argumentos de linha de comando, -T nome_do_arquivo, etc.). Este comportamento pode ou não ser do melhor interesse do oficial bsdtar (provavelmente existe algum motivo --strip-components não está habilitado para o modo c ).

    
por 02.05.2010 / 02:33