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

Je télécharge un site avec wget et beaucoup de liens ont des questions qui leur sont 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 terminer est:

 1.mp3 2.mp3 3.mp3 

Tout cela se déroule dans Linux Linux et j'ai wget 1.10.2.

Je sais que je peux le faire après avoir tout par un script pour renommer tout. Cependant, j'aimerais vraiment une solution à partir de wget afin que je puisse voir les noms corrects à mesure que le téléchargement se déroule.

Quelqu'un peut-il m'aider à démêler cela?

Si le serveur est gentil, cela pourrait contenir un en-tête Content-Disposition sur le téléchargement pour informer votre client du nom de fichier correct. Raconter à 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 nouvelle version de wget pour utiliser cette fonctionnalité.

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

Je me suis rendu compte après avoir traité un gros lot que j'avais demandé à wget d'ignorer les chaînes de requêtes. Je ne voulais pas le faire encore une fois, alors j'ai fait ce script qui m'a fonctionné:

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

Mettez cela dans un fichier comme rmqstr et chmod +x rmqstr Syntaxe: ./rmqstr <directory (defaults to .)>

Il supprimera récursivement les chaînes de requêtes de tous les noms de fichiers.

Je pense que, pour que wget puisse être enregistré en tant que nom de fichier différent de l'URL spécifié, vous devez utiliser l'argument -O filename . Cela ne fait que ce que vous voulez lorsque vous lui donnez un seul URL – avec plusieurs URL, tout le contenu téléchargé se retrouve dans le filename de filename .

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

  1. Exécutez wget pour obtenir les fichiers HTML de base contenant vos liens;
  2. Analysez les URL;
  3. Foreach URL se termine en mp3 ,
    1. URL de processus pour obtenir un nom de fichier (par exemple, tournez http://foo/bar/baz.mp3?gargle=blaster dans baz.mp3
    2. (Facultatif) vérifiez que le nom du fichier n'existe pas
    3. Exécutez wget <URL> -O <filename>

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

Avez-vous une URL de site / base particulière à l'esprit? Les étapes 1 et 3 seront plus faciles à manipuler avec un exemple concret.

Afin que je puisse voir les noms corrects à mesure que le téléchargement se produit.

D'ACCORD. Utilisez wget comme vous le faites habituellement; Utilisez le script post-wget que vous utilisez normalement, mais procédez à la sortie de Wget afin qu'il soit plus facile pour les yeux:

 #! /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 # rename files 

Cela montrera toujours la ?foo=bar que vous téléchargez, mais affichera le reste du nom en cyan clair.

C'est encore plus facile: https://unix.stackexchange.com/questions/196253/how-do-you-rename-files-specifically-in-a-list-that-wget-will-use

Cela suggère une méthode qui utilise essentiellement la fonction de renommage de Wget (peut être modifiée pour inclure le répertoire) pour plusieurs fichiers. Voir la deuxième version proposée.