Kann ich aufhören, Duplikate zu erstellen?

13

Wenn ich wget zweimal ausführe, erkennt es nicht, dass es diese Datei bereits heruntergeladen hat, und erstellt eine neue. Gibt es eine Möglichkeit, das erneute Herunterladen der Datei zu verhindern?

$ 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’
...

(Ich benutze gerne curl oder eine ähnliche skriptfähige Alternative, wenn wget das nicht kann.)

david.libremone
quelle
9
Nun, es erstellt ein neues, weil es erkennt, dass die Datei da ist!
Nico

Antworten:

17

Ich schlage vor, Sie verwenden die -NOption.

-N
--timestamping
    Turn on time-stamping.

Es aktiviert die Zeitstempelung, bei der die Datei nur dann erneut heruntergeladen wird, wenn sie auf dem Server neuer ist als die heruntergeladene Version.

$ 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 (von KasiyA Kommentar)

Wenn der Server nicht ordnungsgemäß konfiguriert ist, wird möglicherweise immer gemeldet, dass die Datei neu ist, und die Datei -Nwird immer erneut heruntergeladen. In diesem Fall -ncist wahrscheinlich eine bessere Option.

Jofel
quelle
3
Wenn ein Server nicht richtig konfiguriert ist, -Nkann dies fehlschlagen und wget wird immer neu heruntergeladen. So ist manchmal -ncbesser als-N
αғsнιη
1
@ Kasiy danke für deinen Kommentar, es scheint keine gute Option für alle Fälle zu geben.
Jofel
16

Ja, es ist eine -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.

Wenn die Datei identisch ist, wird der zweite Download-Versuch abgebrochen.

$ 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.

Vorsichtsmaßnahmen (aus Jofels Kommentaren)

Wenn sich die Datei auf dem Server geändert hat, kann die -cOption zu falschen Ergebnissen führen.

Mit -cfragt wget einfach den Server nach Daten, die über den Teil der bereits heruntergeladenen Datei hinausgehen, sonst nichts. Es wird nicht überprüft, ob Änderungen an dem bereits heruntergeladenen Teil der Datei vorgenommen wurden. So könnten Sie eine beschädigte Datei, die eine Mischung aus der alten und der neuen Datei ist.


Lokaler Test

Sie können es testen , indem Sie einfach lokalen Web-Server ausgeführt werden, wie folgend (Dank @roadmr ‚s Antwort ):

Öffnen Sie ein Terminalfenster und geben Sie Folgendes ein:

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

Jetzt öffne ein anderes Terminal und mache:

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

Beachten Sie, dass dies filename-to-downloaddie Datei ist, in /path/to/parent-download-dir/die wir sie herunterladen möchten.

Wenn Sie nun den Befehl wget mehrmals ausführen, wird Folgendes angezeigt:

The file is already fully retrieved; nothing to do.

OK, gehen Sie jetzt in das /path/to/parent-download-dir/Verzeichnis und fügen Sie der Quelldatei etwas hinzu. Wenn es sich beispielsweise um eine Textdatei handelt, fügen Sie eine einfache zusätzliche Zeile hinzu und speichern Sie die Datei. Versuchen Sie es jetzt mit wget -c .... Gut, jetzt sehen Sie, dass die Datei erneut heruntergeladen wird, aber Sie haben sie bereits zuvor heruntergeladen.

Grund: Warum erneut herunterladen?

weil seine Größe zu einer größeren Größe geändert wurde als die alte heruntergeladene Datei und sonst nichts.

αғsнιη
quelle
1
Dies funktioniert nicht richtig, wenn sich die Datei zwischen den Downloads auf dem Server geändert hat. Im schlimmsten Fall (Dateigröße hat zugenommen) erhalten Sie eine beschädigte Datei.
Jofel
1
@jofel ja -ncnicht wie du gesagt hast, aber die -cOption wird funktionieren und deshalb habe ich die -cOption zuerst erwähnt.
αғsнιη
Mit -c, wgetfragt den Server für alle Daten über den Teil der bereits heruntergeladenen Datei, sonst nichts. Es wird nicht geprüft, ob zwischenzeitlich Änderungen an dem bereits heruntergeladenen Teil der Datei auf dem Server vorgenommen wurden. Im schlimmsten Fall erhalten Sie eine beschädigte Datei, die eine Mischung aus der alten und der neuen Datei darstellt.
Jofel
nachdem die Optionen bewerten Ich denke , das für so etwas wie eine Protokolldatei nur dann sinnvoll ist (inkrementelles Updates garantiert), in allen anderen Fällen denke ich , N oder -nc sind besser geeignet , da sie mit ganzen Dateien umgehen
david.libremone
3

Es gibt auch eine andere Option -ncfür das 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.

Wenn die -ncOption angegeben ist, verweigert Wget das Herunterladen von Kopien derselben Datei. Wenn Sie dieselbe Datei wgetheruntergeladen haben, wird der Download verweigert, es sei denn, Sie benennen die lokale Datei um oder entfernen sie.

$ 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.

Manchmal ist diese Option sehr gut und ich empfehle die -ncOption anstelle von beiden -coder, -Nweil diese Optionen die Download-Datei mit Ihrer lokalen Datei überschreiben, wenn sie den gleichen Namen haben.

Caveat (von Jofel Kommentar)

Die -ncOption aktualisiert die Datei nicht, wenn sie sich auf dem Server geändert hat. Wenn Sie wissen, dass sich die Datei ändern wird, ist die -NOption vorzuziehen. Wenn Sie wissen, dass sich die Datei nicht ändert (oder es Ihnen egal ist), -ncist dies in Ordnung.

αғsнιη
quelle
1

Ich weiß, dass dies eine spezielle Frage in Bezug auf wget war, aber das OP erwähnte "Ich bin froh, Curl oder eine ähnliche skriptfähige Alternative zu verwenden, wenn wget dies nicht kann." Ich bin mir nicht sicher, welche Anforderungen hier gestellt werden (mehrere Dateien, alte Version beibehalten, falls diese vom Original abweicht, durch neu heruntergeladene Version ersetzen). Abhängig davon, was Sie wollen und wie Sie mit Duplikaten umgehen möchten, benötigen Sie möglicherweise mehr als dies. Eine sehr einfache Möglichkeit, das zu tun, was Sie zu wollen scheinen, besteht darin, stattdessen einfach Locken zu verwenden.

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

Dieser Befehl ersetzt jedes Mal die alte Datei durch die neu heruntergeladene.

Geben Sie dies nicht auf dem Terminal aus (ohne "> [Dateiname]"), wenn Sie im Gegensatz zu Text eine Binärdatei herunterladen. Andernfalls kann es zu Problemen mit Ihrer Terminalsitzung kommen. Wenn Sie dies versehentlich tun, müssen Sie möglicherweise eine andere Shell- / Terminalsitzung öffnen.

Goblinlord
quelle
Wenn Ihr Terminal in einem schlechten Zustand ist, weil Sie Binärdateien angezeigt haben, ist es möglicherweise einfacher, das Programm "Zurücksetzen" aufzurufen, als ein neues Terminal zu öffnen.
Jofel
du hast recht, dass ich meine anforderungen nicht geklärt habe, das glückliche ergebnis ist, dass ich ein paar weitere
möglichkeiten kennengelernt habe
Danke @jofel ^^ wusste nichts über "Zurücksetzen" Ich habe immer nur einen neuen Tab geöffnet und den verstümmelten geschlossen, wenn dies passierte ... obwohl ich es nicht wirklich oft hatte.
Goblinlord