40 votes

Comment puis-je demander à wget de renommer les fichiers téléchargés pour ne pas inclure la chaîne de requête ?

Je télécharge un site avec wget et beaucoup de liens ont des requêtes attachées, alors quand je fais ceci:

wget -nv -c -r -H -A mp3 -nd http://url.to.old.podcasts.com/

Je me retrouve avec beaucoup de fichiers comme ceci:

1.mp3?foo=bar
2.mp3?blatz=pow
3.mp3?fizz=buzz

Ce que je voudrais obtenir, c'est :

1.mp3
2.mp3
3.mp3

Tout cela se passe dans ubuntu linux et j'ai wget 1.10.2.

Je sais que je peux le faire après avoir tout téléchargé via un script pour renommer tout. Cependant, j'aimerais vraiment une solution depuis wget pour pouvoir voir les noms corrects pendant le téléchargement.

Est-ce que quelqu'un peut m'aider à résoudre cela?

28voto

Filox Points 281

Si le serveur est gentil, il pourrait coller un en-tête Content-Disposition sur le téléchargement en conseillant à votre client le nom de fichier correct. Dire à wget d'écouter cet en-tête pour le nom de fichier final est aussi simple que :

wget --content-disposition

Vous aurez besoin d'une version récente de wget pour utiliser cette fonctionnalité.

Je n'ai aucune idée de la façon dont il gère un serveur revendiquant un nom de fichier '/etc/passwd'.

21voto

Gregory Wolf Points 356

J'ai réalisé après le traitement d'un grand lot que j'aurais dû instruire wget d'ignorer les chaînes de requête. Je ne voulais pas le refaire alors j'ai fait ce script qui a fonctionné pour moi :

# /bin/bash
for i in `find $1 -type f`
do
    mv $i `echo $i | cut -d? -f1`
done

Placez cela dans un fichier comme rmqstr et chmod +x rmqstr Syntaxe : ./rmqstr

Cela supprimera les chaînes de requête de tous les noms de fichiers de manière récursive.

5voto

user12786 Points 454

Je pense que, pour obtenir wget pour enregistrer sous un nom de fichier différent de celui spécifié dans l'URL, vous devez utiliser l'argument -O nom_fichier. Cela fonctionne uniquement lorsque vous lui donnez une seule URL -- avec plusieurs URL, tout le contenu téléchargé se retrouve dans nom_fichier.

Mais c'est vraiment la réponse. Au lieu d'essayer de tout faire dans une seule commande wget, utilisez plusieurs commandes. Maintenant, votre flux de travail devient :

  1. Exécuter wget pour obtenir le(s) fichier(s) HTML de base contenant vos liens ;
  2. Rechercher les URLs ;
  3. Pour chaque URL se terminant par mp3,
    1. traiter l'URL pour obtenir un nom de fichier (par exemple, transformer http://foo/bar/baz.mp3?gargle=blaster en baz.mp3
    2. (facultatif) vérifier que le nom de fichier n'existe pas
    3. exécuter wget -O

Cela résout votre problème, mais maintenant vous devez trouver comment obtenir les fichiers de base pour trouver vos URLs mp3.

Avez-vous un site particulier/URL de base en tête ? Les étapes 1 et 3 seront plus faciles à gérer avec un exemple concret.

1voto

sep332 Points 404

pour que je puisse voir les noms corrects pendant le téléchargement.

D'accord. Utilisez wget comme d'habitude; utilisez le script post-wget que vous utilisez normalement, mais traitez la sortie de wget de manière à ce qu'elle soit plus agréable à lire:

#! /bin/sh
exec wget --progress=bar:force $* 2>&1 | \
  perl -pe 'BEGIN { $| = 1 } s,(?<=`)([^\x27?]+),\e[36;1m$1\e[0m, if /^Saving/'
cgi-cut # renommer les fichiers

Cela montrera toujours le ?foo=bar pendant le téléchargement, mais affichera le reste du nom en cyan vif.

1voto

Vijay Padhariya Points 11

Regardez ces deux commandes que j'ai créées pour cloner un site, et une fois le clonage terminé, vous pouvez exécuter la deuxième commande.

La deuxième commande va parcourir tout le clone, rechercher les noms de fichiers correspondant au motif "?", et supprimera la chaîne de requête du nom du fichier.

# Cloner l'ensemble du site.
    wget --content-disposition --execute robots=off --recursive --no-parent --continue --no-clobber http://example.com

# Supprimer la chaîne de requête d'une ressource statique.
for i in `find $1 -type f -name "*\?*"`; do mv $i `echo $i | cut -d? -f1`; done

(Voir sur GitHub Gist.)

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X