Pomiń pobieranie, jeśli pliki istnieją w wget?

199

To jest najprostszy przykład uruchamiania wget:

wget http://www.example.com/images/misc/pic.png

ale jak sprawić, by wget pomijał pobieranie, jeśli pic.pngjest już dostępny?

nais inpoh gan
źródło

Odpowiedzi:

270

Wypróbuj następujący parametr:

-nc, --no-clobber: pomiń pobieranie, które pobierałoby do istniejących plików.

Przykładowe użycie:

wget -nc http://example.com/pic.png
plundra
źródło
35
-ncnie uniemożliwia wysłania żądania HTTP i późniejszego pobrania pliku. Po prostu nie robi nic po pobraniu pliku, jeśli plik został już w pełni pobrany. Czy istnieje sposób, aby zapobiec wysyłaniu żądania HTTP, jeśli plik już istnieje? stackoverflow.com/questions/33203898/...
ma11hew28,
8
Jak zauważono w połączonym pytaniu, nie zgadzam się - jeśli nie zostanie użyty żaden clobber, a nazwa pliku istnieje, zostanie zamknięty. Nawet nie ma żądania HEAD. Nawet jeśli tak nie było, sprawdź, czy masz plik na początek :-)[ ! -e "$(basename $URL)" ] && wget $URL
plundra
3
Myślę, że mogę uzyskiwać różne wyniki, ponieważ korzystam z tej --recursiveopcji.
ma11hew28,
198

-nc, --no-clobberOpcja ta nie jest najlepszym rozwiązaniem, ponieważ nowe pliki nie zostaną pobrane. -NZamiast tego należy użyć, który pobierze i nadpisze plik tylko wtedy, gdy serwer ma nowszą wersję, więc poprawna odpowiedź to:

wget -N http://www.example.com/images/misc/pic.png

Następnie uruchomienie Wget z opcją -N, z lub bez -rlub -p, decyzja o tym, czy pobrać nowszą kopię pliku, zależy od lokalnego i zdalnego znacznika czasu i wielkości pliku. -ncnie można podać w tym samym czasie co -N.

-N, --timestamping: Włącz oznaczanie czasu.

Daniel Sokołowski
źródło
39
Gdy serwer nie jest poprawnie skonfigurowany, -Nmoże się nie powieść, a wget zawsze pobierze ponownie. Więc czasami -ncjest lepsze rozwiązanie.
użytkownik
2
jaki mógłby być odpowiedni scenariusz, w którym wystąpiłby komunikat „Gdy serwer nie jest poprawnie skonfigurowany”?
AjayKumarBasuthkar
podczas pobierania z miejsca, które zostało skopiowane, zmieniając wszystkie znaczniki czasu.
Robert
To, czy jest to najlepsze, zależy od kontekstu. Na przykład pobieram ~ 1600 plików z listy, a następnie aktualizuję listę, aby zawierała więcej plików. Pliki się nie zmieniają, więc nie dbam o najnowszą wersję i nie chcę, aby sprawdzała serwer pod kątem nowych wersji 1600 plików, które już mam.
JBentley,
2
@AjayKumarBasuthkar: Gdy serwer nie obsługuje żadnego sposobu sprawdzania nowszego pliku, wgetbędzie narzekał Last-modified header missing; jest to dokładnie nakreślona sytuacja.
Piskvor opuścił budynek
23

Podczas uruchamiania Wget z -rlub -p, ale bez -N, -ndlub -nc, ponowne pobranie pliku spowoduje, że nowa kopia po prostu nadpisze stary.

Tak więc dodanie -nczapobiegnie takiemu zachowaniu, zamiast tego spowoduje zachowanie oryginalnej wersji i zignorowanie wszelkich nowszych kopii na serwerze.

Zobacz więcej informacji na GNU.

Mahesh
źródło
18

Odpowiedź, której szukałem, to https://unix.stackexchange.com/a/9557/114862 .

Użycie -cflagi, gdy plik lokalny ma większy lub równy rozmiar od wersji serwera, pozwoli uniknąć ponownego pobierania.

jsta
źródło
1
Jest to szczególnie świetne, gdy pobierasz kilka plików z flagą -i. wget -i filelist.txt -cwznowi nieudane pobieranie listy plików.
Trevor,