extração de alcatrão depende do nome do arquivo?

33

Costumo baixar tarballs com o wget do sourceforge.net.

Os arquivos baixados são nomeados, por exemplo, SQliteManager-1.2.4.tar.gz?r=http:%2F%2Fsourceforge.net%2Fprojects%2Fsqlitemanager%2Ffiles%2F&ts=1305711521&use_mirror=switch

Quando tento

tar xzf SQliteManager-1.2.4.tar.gz\?r\=http\:%2F%2Fsourceforge.net%2Fprojects%2Fsqlitemanager%2Ffiles%2F\&ts\=1305711521\&use_mirror\=switch

Eu recebo a seguinte mensagem de erro:

tar (child): Cannot connect to SQliteManager-1.2.4.tar.gz?r=http: resolve failed

gzip: stdin: unexpected end of file
tar: Child returned status 128
tar: Error is not recoverable: exiting now

Depois de renomear o arquivo para foo.tar.gza extração, funciona perfeitamente.

Existe uma maneira de não ser forçado a renomear cada vez que o arquivo de destino antes de extrair?

Casper
fonte

Respostas:

50

O motivo do erro que você está vendo pode ser encontrado na documentação tar do GNU :

Se o nome do arquivo inclui dois pontos (':'), é considerado um arquivo em outra máquina [...]

Ou seja, ele está interpretando SQliteManager-1.2.4.tar.gz?r=httpcomo um nome de host e tentando resolvê-lo para um endereço IP, daí o erro "resolver falha".

A mesma documentação continua dizendo:

Se você precisar usar um arquivo cujo nome inclua dois pontos, o comportamento da unidade de fita remota poderá ser inibido usando a opção '--force-local'.

camh
fonte
Note que isso --force-localdeve ser adicionado antes do f... quando eu tentei isso, estava me dando uma mensagem de erro sobre como não existe um arquivo como esse --force-local. Talvez isso seja "não duh" demais, mas eu não reconheci o erro que cometi até 5 minutos depois.
ArtOfWarfare
@ArtOfWarfare: faceita um argumento que é o tarfile. Você não pode colocar --force-localentre fe seu argumento, mas isso é padrão para todos os programas, não apenas tare não apenas -f. Você pode colocar --force-localdepois f, desde que também seja após o argumento f.
camh
como eu disse no meu comentário, talvez seja "no duh" demais. Eu uso o tar assim tar -cvzf ...e nem penso no que cada bandeira faz 99% do tempo - é apenas reflexivo que é assim que eu faço o tar.gz.
ArtOfWarfare
Nesta nota, para ser mais útil sobre o que esses dois (@ArtOfWarfare e @camh) estão dizendo, aqui está um exemplo: tar zxvf C:\Users\jdoe\Documents\tarfile.tgz --force-local
Dr. Dan
6

Ao fazer o download com wget, especifique o nome do arquivo de saída com a -Oopção

wget "http://domain.com/file.tgz?crazy=args&stuff=todelete" -O file.tgz

Isso fará com que o arquivo seja salvo com o nome de arquivo fornecido e o problema ou renomeá-lo. E não, você não é o único que deseja que o sourcefourge não seja tão burro a ponto de distribuir arquivos com os parâmetros de URL anexados.

Caleb
fonte
Isso não é culpa do SourceForge, mas wgeté. Use o --content-dispositionsinalizador para salvar com o nome de arquivo especificado pelo servidor (mas cuidado com as implicações de segurança, pois o SourceForge pode gravar em um nome de arquivo arbitrário).
PCWorld
4

Faça o download usando

wget --trust-server-names URL

Dessa forma, o wget será salvo com os nomes de arquivo corretos. Por padrão, ele usa o último componente no URL

Por exemplo

wget --trust-server-names http://sourceforge.net/projects/sqlitemanager/files/sqlitemanager/1.2.4/SQliteManager-1.2.4.tar.gz/download
pensador livre
fonte
4

Como citado acima, a :(coluna) faz tarpensar que é um arquivo remoto. Então, precisamos reforçar o fato de que é local.

Falhou

$ tar czf "back$(date -u +"%H:%M").tar.gz" ./
tar (child): Cannot connect to back10: resolve failed
tar: Child returned status 128
tar: Error is not recoverable: exiting now

Solução

Explique o fato de ser um arquivo local anexando ./(diretório atual) e citando corretamente:

$ tar czf ./"back$(date -u +'%H:%M').tar.gz" ./
tar: .: file changed as we read it

O aviso é devido ao fato de eu estar criando no diretório de origem.

Édouard Lopez
fonte
Muito melhor do que usar uma bandeira longa. Também acredito que o download de host remoto é uma opção inútil, enquanto existem ferramentas específicas para atingir esse objetivo.
Alireza Mohamadi 27/10
3

Para arquivos já baixados, isso deve funcionar:

tar xzf - < SQliteManager-1.2.4.tar.gz*
jlliagre
fonte