Jeśli uruchomię wget dwa razy, nie rozpozna, że już pobrał ten plik i utworzy nowy. Czy jest jakiś sposób, aby zapobiec ponownemu pobieraniu pliku?
$ 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’
...
(Chętnie używam curl lub podobnej skryptowalnej alternatywy, jeśli wget nie może tego zrobić.)
Odpowiedzi:
Sugeruję skorzystanie z tej
-N
opcji.Umożliwia znacznik czasu, który ponownie pobiera plik tylko wtedy, gdy jest nowszy na serwerze niż wersja pobrana.
Zastrzeżenie (od komentarza KasiyA)
Jeśli serwer nie jest poprawnie skonfigurowany, zawsze może zgłosić, że plik jest nowy i
-N
zawsze pobierze go ponownie. W takim przypadku-nc
jest to prawdopodobnie lepsza opcja.źródło
-N
może się nie powieść, a wget zawsze pobierze ponownie. Czasami więc-nc
jest lepiej niż-N
Tak, to jest
-c
opcja.Jeśli plik jest taki sam, druga próba pobierania zostanie zatrzymana.
Ostrzeżenia (od komentarzy Jofela)
Jeśli plik zmienił się na serwerze,
-c
opcja może dawać nieprawidłowe wyniki.Z
-c
, wget po prostu prosi serwer o wszelkie dane poza częścią już pobranego pliku, nic więcej. Nie sprawdza, czy nastąpiła zmiana w części pliku, który jest już pobrany. W ten sposób możesz uszkodzić plik, który jest mieszanką starego i nowego pliku.Test lokalny
Można go przetestować uruchamiając prosty lokalnego serwera WWW w następujący sposób (dzięki @roadmr „s odpowiedź ):
Otwórz okna terminala i wpisz:
Teraz otwórz kolejny terminal i wykonaj:
Pamiętaj, że
filename-to-download
jest to plik, w/path/to/parent-download-dir/
którym się znajduje, w którym chcemy go pobrać.Teraz, jeśli uruchomisz polecenie wget wiele razy, zobaczysz:
Ok, teraz przejdź do
/path/to/parent-download-dir/
katalogu i dodaj coś do pliku źródłowego, na przykład jeśli jest to plik tekstowy, dodaj do niego prostą dodatkową linię i zapisz plik. Teraz spróbuj zwget -c ...
. Świetnie, teraz zobaczysz, że plik ponownie się pobiera, ale już go wcześniej pobrałeś.Powód: dlaczego ponowne pobieranie?
ponieważ jego rozmiar zmienił się na większy niż stary pobrany plik i nic więcej.
źródło
-nc
nie jest tak , jak powiedziałeś, ale-c
opcja będzie działać i dlatego wspomniałem o-c
opcji najpierw.-c
,wget
prosi serwer o jakichkolwiek danych poza częścią już pobranego pliku, nic innego. Nie sprawdza, czy w międzyczasie nastąpiła zmiana w już pobranej części pliku na serwerze. W najgorszym przypadku otrzymujesz uszkodzony plik będący mieszanką starego i nowego pliku.Istnieje również inna opcja wywołania
-nc
wgetting:Po
-nc
określeniu opcji Wget odmówi pobrania kopii tego samego pliku. Jeśli masz ten sam plik, którywget
próbuje pobrać, odmówi on pobrania, chyba że zmienisz nazwę pliku lokalnego lub usuniesz go.Czasami ta opcja jest bardzo dobra i zaleciłem użycie
-nc
opcji zamiast obu-c
lub-N
opcji, ponieważ te opcje zastąpią plik do pobrania plikiem lokalnym, jeśli mają te same nazwy.Zastrzeżenie (od komentarza Jofela)
-nc
Opcja nie aktualizuje plik jeśli został zmieniony na serwerze. Jeśli wiesz, że plik ulegnie zmianie,-N
opcja jest lepsza. Jeśli wiesz, że plik się nie zmieni (lub nie obchodzi cię to),-nc
jest w porządku.źródło
Wiem, że było to konkretne pytanie dotyczące wget, ale OP wspomniało: „Cieszę się, że używam curl lub podobnej skryptowalnej alternatywy, jeśli wget nie może tego zrobić”. Nie jestem pewien, jakie jest to wymaganie (wiele plików, zachowaj starą wersję, jeśli jest inna niż oryginalna, zastąp nową pobraną wersją). W zależności od tego, czego chcesz i od tego, jak chcesz obsługiwać duplikaty, możesz potrzebować więcej niż to. Bardzo prostym sposobem na zrobienie tego, co chcesz, jest po prostu użycie curl.
To polecenie zamienia za każdym razem stary plik na nowo pobrany.
Nie wysyłaj tego do terminala (bez „> [nazwa pliku]”), jeśli pobierasz plik binarny zamiast tekstu. Może to potencjalnie zepsuć sesję terminala. Jeśli zrobisz to przypadkowo, może być konieczne otwarcie kolejnej sesji powłoki / terminalu.
źródło