web-dev-qa-db-fra.com

Puis-je arrêter de créer des doublons avec wget?

Si je lance wget deux fois, il ne reconnaît pas qu'il a déjà téléchargé ce fichier et en crée un nouveau. Est-il possible d'empêcher le téléchargement du fichier à nouveau?

$ wget https://cdn.sstatic.net/askubuntu/img/logo.png
...
Saving to: ‘logo.png’
...

$ wget https://cdn.sstatic.net/askubuntu/img/logo.png
...
Saving to: ‘logo.png.1’
...

(Heureux d'utiliser curl ou une alternative scriptable similaire si wget ne peut pas le faire.)

13
david.libremone

Je vous suggère d'utiliser l'option -N.

-N
--timestamping
    Turn on time-stamping.

Il active l'horodatage, qui ne télécharge à nouveau le fichier que s'il est plus récent sur le serveur que la version téléchargée.

$ wget -N https://cdn.sstatic.net/askubuntu/img/logo.png
...
Saving to: ‘logo.png’
...

$ wget -N https://cdn.sstatic.net/askubuntu/img/logo.png
...
Server file no newer than local file ‘logo.png’ -- not retrieving.

Caveat (du commentaire de KasiyA)

Si le serveur n'est pas configuré correctement, il peut toujours indiquer que le fichier est nouveau et -N le téléchargera toujours. Dans ce cas, -nc est probablement une meilleure option.

17
jofel

Oui, c'est l'option -c.

--continue
    Continue getting a partially-downloaded file.  This is useful when you want to
    finish up a download started by a previous instance of Wget, or by another
    program.

Si le fichier est identique, la deuxième tentative de téléchargement s'arrête.

$ wget -c https://cdn.sstatic.net/askubuntu/img/logo.png
...
Saving to: ‘logo.png’
...

$ wget -c https://cdn.sstatic.net/askubuntu/img/logo.png
...
The file is already fully retrieved; nothing to do.

Mises en garde (à partir des commentaires de jofel)

Si le fichier a changé sur le serveur, l'option -c peut donner des résultats incorrects.

Avec -c, wget demande simplement au serveur des données dépassant la partie du fichier déjà téléchargé, rien d’autre. Il ne vérifie pas s'il y a eu des changements dans la partie du fichier déjà téléchargée. Ainsi, vous pourriez créer un fichier corrompu, mélange de l'ancien et du nouveau fichier.


Test local

Vous pouvez le tester en exécutant un serveur Web local simple comme suit (Merci à @ roadmranswer ):

Ouvrez une fenêtre de terminal et tapez:

cd /path/to/parent-download-dir/
python -m SimpleHTTPServer

Maintenant, ouvrez un autre terminal et faites:

wget -c http://localhost:8000/filename-to-download

Notez que filename-to-download est le fichier qui se trouve dans /path/to/parent-download-dir/ que nous voulons télécharger.

Maintenant, si vous exécutez la commande wget plusieurs fois, vous verrez:

The file is already fully retrieved; nothing to do.

Ok, allez maintenant dans le répertoire /path/to/parent-download-dir/ et ajoutez quelque chose au fichier source, par exemple s’il s’agit d’un fichier texte, ajoutez-y une simple ligne supplémentaire et sauvegardez le fichier. Maintenant, essayez avec wget -c .... Génial, vous verrez à nouveau le fichier téléchargé à nouveau, mais vous l'avez déjà téléchargé auparavant.

Raison: pourquoi re-télécharger?

parce que sa taille a changé pour être plus grande que l’ancien fichier téléchargé et rien d’autre.

16
αғsнιη

De plus, il existe une autre option appelée -nc pour wgetting:

--no-clobber
   If a file is downloaded more than once in the same directory, Wget's behavior
   depends on a few options, including -nc.  In certain cases, the local file will
   be clobbered, or overwritten, upon repeated download.  In other cases it will be
   preserved.

Lorsque l'option -nc est spécifiée, Wget refuse de télécharger des copies du même fichier. Si vous avez le même fichier que wget essaie de télécharger, il refusera de le télécharger sauf si vous renommez ou supprimez le fichier local.

$ wget -nc https://cdn.sstatic.net/askubuntu/img/logo.png
...
Saving to: ‘logo.png’
...

$ wget -nc https://cdn.sstatic.net/askubuntu/img/logo.png
File ‘logo.png’ already there; not retrieving.

Parfois, cette option est très bon et j’ai recommandé d’utiliser l’option -nc au lieu des deux options -c ou -N car ces options vont écraser le fichier à télécharger avec votre fichier local s’ils avaient mêmes noms.

Caveat (du commentaire de jofel)

L'option -nc ne met pas à jour le fichier s'il a été modifié sur le serveur. Si vous savez que le fichier va changer, l'option -N est préférable. Si vous savez que le fichier ne changera pas (ou que vous ne vous en souciez pas), alors -nc est ok.

3
αғsнιη

Je sais que c’était une question spécifique concernant wget, mais le PO a bien mentionné "Heureux d’utiliser curl ou une alternative scriptable similaire si wget ne peut pas le faire". Je ne sais pas quelle est la condition requise ici (plusieurs fichiers, conservez l'ancienne version si elle est différente de l'original, remplacez-la par la version récemment téléchargée). En fonction de ce que vous voulez et de la manière dont vous voulez gérer les doublons, vous aurez peut-être besoin de plus que cela. Un moyen très simple de faire ce que vous semblez vouloir est simplement d'utiliser curl à la place.

curl http://cdn.sstatic.net/askubuntu/img/logo.png?v=ca4d192163aa > logo.png

Cette commande remplacera l'ancien fichier par le nouveau téléchargé à chaque fois.

N'envoyez pas ceci au terminal (sans le "> [nom du fichier]") si vous téléchargez un fichier binaire au lieu d'un fichier texte. Cela risquerait de gâcher votre session de terminal. Si vous le faites par accident, vous devrez peut-être ouvrir une autre session Shell/terminal.

1
Goblinlord