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.)
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.
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.
parce que sa taille a changé pour être plus grande que l’ancien fichier téléchargé et rien d’autre.
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.
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.