l'extraction de goudron dépend du nom de fichier?

33

Je télécharge souvent des tarballs avec wget depuis sourceforge.net.

Les fichiers téléchargés sont alors nommés, par exemple SQliteManager-1.2.4.tar.gz?r=http:%2F%2Fsourceforge.net%2Fprojects%2Fsqlitemanager%2Ffiles%2F&ts=1305711521&use_mirror=switch

Quand j'essaye de

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

Je reçois le message d'erreur suivant:

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

Après avoir renommé le fichier à foo.tar.gzl'extraction fonctionne parfaitement.

Existe-t-il un moyen que je ne sois pas obligé de renommer à chaque fois le fichier cible avant l'extraction?

casper
la source

Réponses:

50

La raison de l'erreur que vous voyez peut être trouvée dans la documentation GNU tar :

Si le nom du fichier d'archive comprend deux points (':'), il est supposé être un fichier sur une autre machine [...]

Autrement dit, il interprète en SQliteManager-1.2.4.tar.gz?r=httptant que nom d'hôte et essaie de le résoudre en une adresse IP, d'où l'erreur «Échec de la résolution».

Cette même documentation poursuit:

Si vous devez utiliser un fichier dont le nom inclut deux points, le comportement du lecteur de bande distant peut être inhibé en utilisant l'option «--force-local».

camh
la source
Notez que cela --force-localdoit être ajouté avant le f... lorsque j'ai essayé pour la première fois, cela me donnait un message d'erreur indiquant qu'il n'y avait pas de fichier tel que --force-local. Peut-être que c'est trop "pas duh" mais je n'ai reconnu l'erreur que j'ai faite que 5 minutes plus tard.
ArtOfWarfare
@ArtOfWarfare: fprend un argument qui est le fichier tar. Vous ne pouvez pas mettre --force-localentre l' fargument et son argument, mais c'est la norme pour tous les programmes, pas seulement taret pas seulement -f. Vous pouvez mettre --force-localaprès ftant qu'il est également après l'argument to f.
camh
comme je l'ai dit dans mon commentaire, c'est peut-être trop "non duh". J'utilise tar comme ça tar -cvzf ...et je ne pense même pas à ce que chaque drapeau fait vraiment 99% du temps - c'est juste réflexif que c'est comme ça que je fais un tar.gz.
ArtOfWarfare
Sur cette note, pour être plus utile sur ce que ces deux (@ArtOfWarfare et @camh) disent voici un exemple: tar zxvf C:\Users\jdoe\Documents\tarfile.tgz --force-local
Dr Dan
6

Lorsque vous téléchargez avec wget, spécifiez le nom du fichier de sortie avec l' -Ooption.

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

Cela entraînera l'enregistrement du fichier avec le nom de fichier donné et vous évitera le problème ou le renommer. Et non, vous n'êtes pas le seul à souhaiter que sourcefourge ne soit pas stupide au point de distribuer des fichiers avec les paramètres url attachés.

Caleb
la source
Ce n'est pas la faute de SourceForge, mais wgetla sienne. Utilisez l' --content-dispositionindicateur pour enregistrer avec le nom de fichier spécifié par le serveur (mais méfiez-vous des implications de sécurité, car SourceForge peut alors écrire dans un nom de fichier arbitraire).
pcworld
4

Télécharger en utilisant

wget --trust-server-names URL

De cette façon, wget enregistrera avec les noms de fichiers corrects. Par défaut, il utilise le dernier composant de l'URL

Par exemple

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

Comme cité ci-dessus, la :(colonne) fait tarpenser que c'est un fichier distant. Nous devons donc faire en sorte que ce soit local.

Échouer

$ 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

Solution

Expliquez le fait qu'il s'agit d'un fichier local en ajoutant ./(répertoire actuel) et en citant correctement:

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

L'avertissement est dû au fait que je crée dans le répertoire source.

Édouard Lopez
la source
Beaucoup mieux que d'utiliser un long drapeau. Je pense également que le téléchargement d'hôte à distance est une option inutile alors qu'il existe des outils spécifiques pour atteindre cet objectif.
Alireza Mohamadi
3

Pour les fichiers déjà téléchargés, cela devrait fonctionner:

tar xzf - < SQliteManager-1.2.4.tar.gz*
jlliagre
la source