¿La extracción de alquitrán depende del nombre del archivo?

33

A menudo descargo tarballs con wget desde sourceforge.net.

Los archivos descargados se nombran, p. Ej. SQliteManager-1.2.4.tar.gz?r=http:%2F%2Fsourceforge.net%2Fprojects%2Fsqlitemanager%2Ffiles%2F&ts=1305711521&use_mirror=switch

Cuando trato de

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

Recibo el siguiente mensaje de error:

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

Después de renombrar el archivo a foo.tar.gzla extracción funciona perfecto.

¿Hay alguna manera de que no esté obligado a cambiar el nombre cada vez que el archivo de destino antes de extraerlo?

casper
fuente

Respuestas:

50

La razón del error que está viendo se puede encontrar en la documentación de GNU tar :

Si el nombre del archivo incluye dos puntos (':'), entonces se supone que es un archivo en otra máquina [...]

Es decir, se interpreta SQliteManager-1.2.4.tar.gz?r=httpcomo un nombre de host e intenta resolverlo en una dirección IP, de ahí el error de "resolución fallida".

Esa misma documentación continúa diciendo:

Si necesita usar un archivo cuyo nombre incluye dos puntos, el comportamiento de la unidad de cinta remota puede inhibirse mediante la opción '--force-local'.

camh
fuente
Tenga en --force-localcuenta que debe agregarse antes de f... cuando probé esto por primera vez, me estaba dando un mensaje de error acerca de cómo no existe tal archivo --force-local. Tal vez esto sea demasiado "no duh" pero no reconocí el error que cometí hasta 5 minutos después.
ArtOfWarfare
@ArtOfWarfare: ftoma un argumento que es el tarfile. No se puede poner --force-localentre fy su argumento, pero eso es estándar para todos los programas, no solo tary no solo -f. Puede poner --force-localdespués de ftanto tiempo como también después del argumento de f.
camh
como dije en mi comentario, tal vez sea demasiado "no duh". Utilizo alquitrán de esta manera tar -cvzf ...y ni siquiera pienso en lo que hace cada bandera realmente el 99% del tiempo: es solo reflexivo que así es como hago un tar.gz.
ArtOfWarfare
En esta nota, para ser más útil sobre lo que estos dos (@ArtOfWarfare y @camh) dicen aquí es un ejemplo: tar zxvf C:\Users\jdoe\Documents\tarfile.tgz --force-local
Dr. Dan
6

Cuando descargue con wget, especifique el nombre del archivo de salida con la -Oopción.

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

Esto hará que el archivo se guarde con el nombre de archivo dado y le ahorrará el problema o le cambiará el nombre. Y no, no eres el único que desea que sourcefourge no sea tan tonto como para pasar archivos con los parámetros de URL adjuntos.

Caleb
fuente
Esto no es culpa de SourceForge, sino wgetde. Use la --content-dispositionbandera para guardar con el nombre de archivo especificado por el servidor (pero tenga cuidado con las implicaciones de seguridad, ya que SourceForge puede escribir en un nombre de archivo arbitrario).
pcworld
4

Descargar usando

wget --trust-server-names URL

De esa manera, wget guardará con los nombres de archivo correctos. Por defecto usa el último componente en la URL

Por ej.

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

Como se citó anteriormente, la :(columna) hace tarpensar que es un archivo remoto. Por lo tanto, debemos hacer cumplir el hecho de que es local.

Fallar

$ 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

Solución

Explícito el hecho de que es un archivo local agregando ./(directorio actual) y citando correctamente:

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

La advertencia se debe al hecho de que estoy creando en el directorio de origen.

Édouard Lopez
fuente
Mucho mejor que usar una bandera larga. También creo que la descarga remota de host es una opción inútil, mientras que existen herramientas específicas para lograr este propósito.
Alireza Mohamadi
3

Para archivos ya descargados, esto debería funcionar:

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