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

13

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

david.libremone
la source
9
Eh bien, il en crée un nouveau car il reconnaît que le fichier est là!
nico

Réponses:

17

Je vous suggère d'utiliser l' -Noption.

-N
--timestamping
    Turn on time-stamping.

Il active l'horodatage, qui ne re-té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 (du commentaire de Kasiya)

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

jofel
la source
3
Lorsqu'un serveur n'est pas configuré correctement, il -Npeut échouer et wget sera toujours retéléchargé. Donc, parfois, -ncc'est mieux que-N
αнsнιη
1
@Kasiy merci pour votre commentaire, il ne semble pas y avoir de bonne option pour tous les cas.
jofel
16

Oui, c'est une -coption.

--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êtera.

$ 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 (d'après les commentaires de jofel)

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

Avec -c, wget demande simplement au serveur toutes les données au-delà de la partie du fichier déjà téléchargé, rien d'autre. Il ne vérifie pas s'il y a eu un changement dans la partie du fichier qui est déjà téléchargée. Ainsi, vous pourriez avoir un fichier corrompu qui est un mélange de l'ancien et du nouveau fichier.


Test local

Vous pouvez le tester en cours d' exécution simple serveur web local comme suit (Merci à @roadmr « s réponse ):

Ouvrez une fenêtre de terminal et saisissez:

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

Ouvrez maintenant un autre terminal et faites:

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

Notez que filename-to-downloadc'est le fichier qui se trouve dans /path/to/parent-download-dir/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, allez maintenant dans le /path/to/parent-download-dir/répertoire 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 .... Très bien, vous verrez à nouveau le fichier à nouveau télécharger, mais vous l'avez déjà téléchargé auparavant.

Raison: pourquoi re-télécharger?

car sa taille est passée à une taille plus grande que l'ancien fichier téléchargé et rien d'autre.

αғsнιη
la source
1
Cela ne fonctionne pas correctement si le fichier a changé sur le serveur entre les téléchargements. Dans le pire des cas (la taille du fichier a augmenté), vous obtenez un fichier corrompu.
jofel
1
@jofel oui -ncne fonctionne pas comme vous l'avez dit, mais l' -coption fonctionnera et c'est pourquoi j'ai mentionné l' -coption en premier.
αғsнιη
Avec -c, wgetdemande au serveur toutes les données au-delà de la partie du fichier déjà téléchargé, rien d'autre. Il ne vérifie pas s'il y a entre-temps une modification de la partie déjà téléchargée du fichier sur le serveur. Au pire, vous obtenez un fichier corrompu qui est un mélange entre l'ancien et le nouveau fichier.
jofel
après avoir examiné les options, je pense que cela n'est utile que pour quelque chose comme un fichier journal (mises à jour incrémentielles garanties), dans tous les autres cas, je pense que -N ou -nc sont plus appropriés car ils traitent de fichiers entiers
david.libremone
3

Il existe également une autre option appelée -ncpour 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 l' -ncoption est spécifiée, Wget refusera de télécharger des copies du même fichier. Si vous aviez le même fichier qui wgettente de télécharger, il refusera de le télécharger à 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 bonne et j'ai recommandé d'utiliser l' -ncoption au lieu des deux -cou l' -Noption car ces options remplaceront le fichier de téléchargement par votre fichier local si elles avaient le même nom.

Caveat (du commentaire de Jofel)

L' -ncoption ne met pas à jour le fichier s'il a changé sur le serveur. Si vous savez que le fichier va changer, l' -Noption est préférable. Si vous savez que le fichier ne changera pas (ou que vous ne vous en souciez pas), alors ça -ncva.

αғsнιη
la source
1

Je sais que c'était une question spécifique concernant wget mais l'OP a mentionné "Heureux d'utiliser curl ou une alternative scriptable similaire si wget ne peut pas faire cela." Je ne sais pas quelle est l'exigence ici (plusieurs fichiers, conserver l'ancienne version si différente de l'original, remplacer par la nouvelle version téléchargée). Selon ce que vous voulez et la façon dont vous voulez gérer les doublons, vous aurez peut-être besoin de plus que cela. Une façon très simple de faire ce que vous semblez vouloir faire est simplement d'utiliser curl à la place.

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

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

N'envoyez pas cela au terminal (sans le "> [nom de fichier]") si vous téléchargez un fichier binaire par opposition au texte. Cela pourrait potentiellement gâcher votre session de terminal. Dans le cas où vous le faites par accident, vous devrez peut-être ouvrir une autre session shell / terminal.

Goblinlord
la source
Si votre terminal est en mauvais état parce que vous avez affiché des fichiers binaires, il est peut-être plus facile d'appeler le programme "reset" que d'ouvrir un nouveau terminal.
jofel
vous avez raison de ne pas avoir été clair sur mes exigences, le résultat heureux est que j'ai appris quelques options supplémentaires :) merci
david.libremone
Merci @jofel ^^ ne savait pas "réinitialiser". J'ai toujours juste ouvert un nouvel onglet et fermé celui brouillé quand cela s'est produit ... même si je ne l'ai pas vraiment fait souvent.
Goblinlord