web-dev-qa-db-fra.com

Comment puis-je faire des fichiers téléchargés WGET Renommer 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 le fais:

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

Je finis avec beaucoup de fichiers comme celui-ci:

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

Ce que j'aimerais finir avec c'est:

1.mp3
2.mp3
3.mp3

Tout cela se produit à Ubuntu Linux et j'ai Wget 1.10.2.

Je sais que je peux faire cela après que je reçois tout via un script pour renommer tout. Cependant, j'aimerais vraiment une solution à partir de Wget afin que je puisse voir les noms corrects car le téléchargement se produit.

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

33
Keith Twombley

Si le serveur est gentil, il peut s'agir d'un en-tête de disposition de contenu sur le téléchargement, conseillant votre client du 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 nouvelle version de Wget pour utiliser cette fonctionnalité.

Je n'ai aucune idée de la qualité d'un serveur revendiquant un nom de fichier de '/ etc/passwd'.

24
Filox

J'ai réalisé après avoir traité un grand lot que j'aurais dû instrument wget d'ignorer les chaînes de requête. Je ne voulais pas le faire encore plus 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

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

Il retirera les cordes de requête de tous les noms de fichiers récursives.

18
Gregory Wolf

Je pense que, afin d'obtenir wget pour enregistrer sous forme de nom de fichier différent de l'URL spécifie, vous devez utiliser le -O filename argument. Cela ne fait que ce que vous voulez lorsque vous lui donnez une seule URL - avec plusieurs URL, tous les contenus téléchargés finissent par filename.

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

  1. Run wget Pour obtenir le (s) fichier HTML de base contenant vos liens;
  2. Analyser les URL;
  3. URL foreach se terminant par mp3,
    1. uRL de processus pour obtenir un nom de fichier (par exemple, Turn http://foo/bar/baz.mp3?gargle=blaster dans baz.mp3
    2. (Facultatif) Vérifiez que le nom de fichier n'existe pas
    3. cours wget <URL> -O <filename>

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

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

4
quack quixote

je peux donc voir les noms corrects car le téléchargement se produit.

D'ACCORD. Utilisez wget comme vous le faites normalement; Utilisez le script post-wget que vous utilisez normalement, mais traitez la sortie de Wget afin que ce soit plus facile sur 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 le ?foo=bar Comme vous le téléchargez, mais affichera le reste du nom dans Bright Cyan.

1
ayrnieu