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

26

Eu freqüentemente faço o download de 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.gz , a extração funciona perfeitamente.

Existe uma maneira, que eu não sou obrigado a renomear cada vez que o arquivo de destino antes de extrair?

    
por casper 18.05.2011 / 11:53

5 respostas

44

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

If the archive file name includes a colon (‘:’), then it is assumed to be a file on another machine[...]

Ou seja, ele está interpretando SQliteManager-1.2.4.tar.gz?r=http como um nome de host e tentando resolvê-lo para um endereço IP, portanto, o erro "resolve falhou".

Essa mesma documentação diz:

If you need to use a file whose name includes a colon, then the remote tape drive behavior can be inhibited by using the ‘--force-local’ option.

    
por 18.05.2011 / 12:58
6

Quando você faz o download com wget , especifique o nome do arquivo de saída com a opção -O .

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

Isso fará com que o arquivo salve com o nome do arquivo fornecido e salve o problema ou renomeie-o. 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.

    
por 18.05.2011 / 11:55
4

Download usando

wget --trust-server-names URL

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

Por exemplo,

wget --trust-server-names http://sourceforge.net/projects/sqlitemanager/files/sqlitemanager/1.2.4/SQliteManager-1.2.4.tar.gz/download
    
por 18.05.2011 / 11:59
3

Para arquivos já baixados, isso deve funcionar:

tar xzf - < SQliteManager-1.2.4.tar.gz*
    
por 18.05.2011 / 13:32
2

Como citado acima, o : (coluna) faz com que tar pense que é um arquivo remoto. Então, precisamos impor o fato de ser local.

Falha

$ 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 acrescentando ./ (diretório atual) e citando corretamente:

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

O aviso se deve ao fato de eu estar criando no diretório de origem.

    
por 16.02.2016 / 11:42

Tags