Comment utiliser wget avec une liste d'URL et leurs fichiers de sortie correspondants?

35

Supposons list_of_urlsque cela ressemble à ceci:

http://www.url1.com/some.txt
http://www.url2.com/video.mp4

Je sais comment l'utiliser avec:

wget -i list_of_urls

Mais que se passe-t-il si ma réponse list_of_urlsest la suivante et tous renvoient les fichiers appropriés, tels que les PDF ou les vidéos:

http://www.url1.com/app?q=123&gibb=erish&gar=ble
http://www.url2.com/app?q=111&wha=tcha&mac=allit

Pour un seul fichier, je pourrais faire ceci:

wget -O some.txt "http://www.url1.com/app?q=123&gibb=erish&gar=ble"

Comment puis-je utiliser wgetpour télécharger cette liste d'URL et enregistrer les données renvoyées dans le fichier local approprié?

Trousse
la source

Réponses:

33

Par défaut, wget écrit dans un fichier dont le nom est le dernier composant de l'URL que vous lui transmettez. De nombreux serveurs redirigent les URL similaires http://www.url1.com/app?q=123&gibb=erish&gar=blevers une URL différente avec un joli nom de fichier comme http://download.url1.com/files/something.pdf. Vous pouvez indiquer à wget d'utiliser le nom de l'URL redirigée (c.-à-d. something.pdf) Au lieu de app?q=123&gibb=erish&gar=bletransmettre l' --trust-server-namesoption. Ce n'est pas le mode par défaut car, s'il est utilisé sans précaution, il pourrait entraîner l'écrasement d'un nom de fichier imprévisible dans le répertoire en cours; mais si vous faites confiance au serveur ou travaillez dans un répertoire ne contenant aucun autre fichier précieux, --trust-server-namesc'est généralement la bonne chose à utiliser.

Certains serveurs utilisent un en- Content-Dispositiontête au lieu d'une redirection pour spécifier un nom de fichier. Passez l' --content-dispositionoption pour que wget utilise ce nom de fichier.

Ainsi:

wget --content-disposition --trust-server-names -i list_of_urls

Si vous n'obtenez toujours pas de beaux noms de fichiers, vous pouvez spécifier le vôtre. Supposons que vous ayez un fichier contenant des lignes comme

http://www.url1.com/app?q=123&gibb=erish&gar=ble foo.pdf
http://www.url2.com/app?q=111&wha=tcha&mac=allit bar.txt

Pour que wget télécharge les fichiers vers les noms de fichier spécifiés, en supposant que l'URL ou les noms de fichier ne contiennent pas de caractères d'espacement:

err=0
while read -r url filename tail; do
  wget -O "$filename" "$url" || err=1
done <list_of_urls_and_file_names

La errvariable contient 0 si tous les téléchargements ont réussi et 1 sinon, vous pouvez le faire return $errsi vous mettez cet extrait de code dans une fonction ou exit $errsi vous insérez cet extrait de code dans une chaîne.

Si vous ne souhaitez spécifier rien d'autre que les URL et que vous ne pouvez pas obtenir de noms intéressants du serveur, vous pouvez deviner le type de fichier et tenter d'obtenir au moins des extensions significatives.

err=0
n=1
while read -r url; do
  if wget -O tmpfile "$url"; then
    ext=data
    case $(file -i tmpfile) in
      application/pdf) ext=pdf;;
      image/jpeg) ext=jpg;;
      text/html) ext=html;;
      text/*) ext=txt;;
    esac
    mv tmpfile "$n.$ext"
  else
    err=1
  fi
  n=$((n+1))
done

Ajoutez d'autres types si vous le souhaitez. Si votre filecommande n'a pas l' -moption, laissez-la de côté et vérifiez ce qui fileretourne sur votre système pour les types de fichiers qui vous intéressent. Si vous avez un fichier /etc/mime.typessur votre système, vous pouvez lire les associations de types MIME avec des extensions. au lieu de fournir votre propre liste:

n=1
while read -r url; do
  if wget -O tmpfile "$url"; then
    mime_type=$(file -m tmpfile)
    ext=$(awk "$1 == \"$mime_type\" {print \$2; exit} END {print \"data\"}" /etc/mime.types)
    mv tmpfile "$n.$ext"
  else
    err=1
  fi
  n=$((n+1))
done
Gilles, arrête de faire le mal
la source
2

Vous pouvez passer en boucle sur les entrées de votre list_of_urls. Quelque chose comme ça:

while read -r url; do
    wget -O foo $url
done < list_of_urls

Notez que vous devrez ajouter votre propre façon de déterminer foopour chaque entrée de la list_of_urls(aussi, je suppose que c'est un fichier sur votre disque).

Rahmu
la source
Voici une variante: créez un petit script avec une ligne wget -O $2 $1. Dans le fichier list_of_urls, faites de chaque ligne une url, un espace, un nom de fichier (par exemple http://url1/blah&blah=whatever some.pdf, utilisez la même chose que ci-dessus, en remplaçant la ligne wget par ./thatscript.sh $url. Dans ce cas, il $urls’agit en fait d’une ligne avec une url et un nom de fichier.
goldilocks
2
Variation 2: Mettez les URL et les noms de fichiers sur des lignes séparées et alternantes dans le fichier list_of_urls, puis utilisez-les while read url; do read filename; wget -O $filename $url; done < list_of_urls.
goldilocks
2

Vous pouvez directement utiliser l' wgetoption:

wget -r -i list_of_urls
Steph
la source
Cela ne fonctionne pas: -ractive le téléchargement récursif. Les noms de fichiers ne sont pas définis correctement.
jofel