13 votes

Puis-je empêcher wget de créer des doublons ?

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. Existe-t-il un moyen de l'empêcher de télécharger à nouveau le fichier ?

$ 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 similaire scriptable si wget ne peut pas le faire).

20voto

jofel Points 326

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

-N
--timestamping
    Turn on time-stamping.

Il permet l'horodatage, qui ne retélécharge 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 (d'après le commentaire de s)

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

16voto

αғsнιη Points 33236

Oui, c'est -c option.

--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 le même, 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.

Avertissements (d'après les commentaires de jofel)

Si le fichier a été modifié sur le serveur, la fonction -c peut donner des résultats incorrects.

Avec -c wget demande simplement au serveur des données autres que celles du fichier déjà téléchargé, rien d'autre. Il ne vérifie pas si la partie du fichier déjà téléchargée a été modifiée. Ainsi, vous pouvez obtenir un fichier corrompu qui est un mélange de l'ancien et du nouveau fichier.


Test local

Vous pouvez le tester en exécutant un simple serveur web local comme suit (merci à @roadmr 's réponse ):

Ouvrez un Terminal Windows 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/ dans lequel nous voulons le 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, maintenant allez à /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 enregistrez le fichier. Essayez maintenant avec wget -c ... . Super, maintenant vous verrez le fichier se retélécharger à nouveau mais vous l'avez déjà téléchargé auparavant.

Motif : pourquoi retélécharger ?

parce que sa taille est devenue plus grande que celle de l'ancien fichier téléchargé et rien d'autre.

3voto

αғsнιη Points 33236

Il existe également une autre option appelée -nc pour le 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 -nc est spécifiée, Wget refusera de télécharger des copies du même fichier. Si vous aviez le même fichier que wget tente de télécharger, il refusera de le faire à moins que vous ne renommiez ou supprimiez 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 bien et j'ai recommandé d'utiliser -nc au lieu des deux -c o -N car ces options écraser le fichier de téléchargement avec votre fichier local s'ils avaient les mêmes noms.

Caveat (d'après le commentaire de jofel)

En -nc L'option 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 sera pas modifié (ou que vous ne vous en souciez pas), alors -nc c'est bon.

1voto

Goblinlord Points 1405

Je sais qu'il s'agit d'une question spécifique concernant wget mais le PO a mentionné "Heureux d'utiliser curl ou une alternative similaire scriptable si wget ne peut pas le faire". Je ne suis pas sûr de l'exigence ici (plusieurs fichiers, conserver l'ancienne version si elle est différente de l'original, remplacer par la version nouvellement téléchargée). En fonction de ce que vous voulez et de la façon dont vous voulez gérer les doublons, vous pouvez avoir besoin de plus que cela . Une façon 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 fichier téléchargé à chaque fois.

N'envoyez pas ce message au terminal (sans le "> [nom du fichier]") si vous téléchargez un fichier binaire plutôt qu'un fichier texte. Cela risquerait de perturber votre session de terminal. Dans le cas où vous le faites par accident, vous devrez peut-être ouvrir une autre session Shell/terminal.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X