l'estrazione del catrame dipende dal nome del file?


33

Scarico spesso tarball con wget da sourceforge.net.

I file scaricati vengono quindi denominati, ad es SQliteManager-1.2.4.tar.gz?r=http:%2F%2Fsourceforge.net%2Fprojects%2Fsqlitemanager%2Ffiles%2F&ts=1305711521&use_mirror=switch

Quando provo a farlo

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

Ricevo il seguente messaggio di errore:

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

Dopo aver rinominato il file foo.tar.gznell'estrazione funziona perfettamente.

C'è un modo che non sono costretto a rinominare ogni volta il file di destinazione prima di estrarlo?

Risposte:


50

Il motivo dell'errore che si vede può essere trovato nella documentazione tar GNU :

Se il nome del file di archivio include due punti (':'), si presume che sia un file su un altro computer [...]

Cioè, sta interpretando SQliteManager-1.2.4.tar.gz?r=httpcome un nome host e sta cercando di risolverlo in un indirizzo IP, quindi l'errore "risoluzione non riuscita".

La stessa documentazione continua dicendo:

Se è necessario utilizzare un file il cui nome include i due punti, è possibile inibire il comportamento dell'unità nastro remota utilizzando l'opzione '--force-local'.


Si noti che --force-localdeve essere aggiunto prima del f... quando l'ho provato per la prima volta mi stava dando un messaggio di errore su come non esiste un file come --force-local. Forse questo è troppo "no duh" ma non ho riconosciuto l'errore che ho fatto fino a 5 minuti dopo.
ArtOfWarfare il

@ArtOfWarfare: faccetta un argomento che è il tarfile. Non puoi mettere --force-localtra il fe il suo argomento, ma questo è standard per tutti i programmi, non solo tare non solo -f. Puoi mettere --force-localdopo fpurché sia ​​anche dopo l'argomento f.
Camh,

come ho detto nel mio commento, forse è troppo "no duh". Uso tar in questo modo tar -cvzf ...e non penso nemmeno a ciò che ogni bandiera fa davvero il 99% delle volte - è solo riflessivo che è così che faccio un tar.gz.
ArtOfWarfare l'

In questa nota, per essere più utili su ciò che questi due (@ArtOfWarfare e @camh) stanno dicendo qui è un esempio: tar zxvf C:\Users\jdoe\Documents\tarfile.tgz --force-local
Dr. Dan

6

Quando si esegue il download con wget, specificare il nome del file di output con l' -Oopzione.

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

Ciò farà sì che il file venga salvato con il nome file specificato e ti salverà il problema o rinominandolo. E no, non sei l'unico a desiderare che sourcefourge non sia così stupido da distribuire file con i parametri url allegati.


Non è colpa di SourceForge, ma wgetdi. Utilizzare il --content-dispositionflag per salvare con il nome file specificato dal server (ma attenzione alle implicazioni di sicurezza, poiché SourceForge può quindi scrivere su un nome file arbitrario).
pcworld,

4

Scarica utilizzando

wget --trust-server-names URL

In questo modo wget salverà con i nomi file corretti. Per impostazione predefinita utilizza l'ultimo componente nell'URL

Per es

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

4

Come sopra citato, la :(colonna) fa tarpensare che sia un file remoto. Quindi dobbiamo far rispettare il fatto che è locale.

Fallire

$ 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

Soluzione

Esplicere il fatto che si tratta di un file locale aggiungendo ./(directory corrente) e quotando correttamente:

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

L'avvertimento è dovuto al fatto che sto creando nella directory di origine.


Molto meglio dell'uso di una bandiera lunga. Inoltre credo che il download dell'host remoto sia un'opzione inutile mentre ci sono strumenti specifici per raggiungere questo scopo.
Alireza Mohamadi,

3

Per i file già scaricati, dovrebbe funzionare:

tar xzf - < SQliteManager-1.2.4.tar.gz*
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.