Você certamente pode criar um tar de stdin. Use -
como a fonte e canalize o que você quiser para isso.
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.
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.
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
).