wget -o zapisuje puste pliki po awarii

14

Jeśli napiszę wget „brak takiego adresu” -o „test.html”, najpierw tworzy test.html, aw przypadku awarii pozostawia go pustym. Jednak gdy nie użyjesz opcji -o, zaczeka, czy pobieranie się powiedzie, a dopiero potem zapisze plik.

Chciałbym, aby to drugie zachowanie dotyczyło również -o, czy to możliwe?

akurtser
źródło

Odpowiedzi:

17

wget zwraca niezerowy status wyjścia, gdy adres URL nie zostanie znaleziony, dzięki czemu możesz dołączyć komendę usuwania w przypadku niepowodzenia:

wget "url" -O file || rm -f file

Lub utwórz plik tymczasowy i przenieś go tylko tam, gdzie chcesz, aby odnieść sukces:

wget "url" -O /tmp/wget && mv /tmp/wget file

Druga ma tę zaletę, że nie usuwa istniejącego pliku w przypadku awarii, ale pamiętaj, aby używać unikalnych nazw tymczasowych (patrz man tempfile), jeśli korzystasz z wielu instancji równolegle.

Ian Mackinnon
źródło
Dodanie --retry-connrefused może przede wszystkim pomóc w zapobieganiu pustemu plikowi.
akom
Jeśli dzieje się tak w exec w manifestie marionetkowym, zmiana tworzy plik => na chyba, że ​​= = „[-s plik]” może spowodować samoleczenie.
akom
13

Jak napisano w komentarzach, wget -O bardziej przypomina przekierowanie powłoki, które zawsze zapisuje do pliku, niezależnie od błędów.

Zamiast tego możesz użyć curl -f:

curl -f http://nonexistent/file.jpg -o localfile.jpg

Nie dotknie lokalnego pliku, jeśli wystąpi błąd podczas pobierania pliku.

cweiske
źródło
4

Prawidłowa składnia to

wget "url" -O file

zwróć uwagę na WIELKIE OZ. Opcje -o każą wget napisać plik dziennika , dlatego zawsze jest zapisywany nawet w przypadku awarii.

Pan Shunz
źródło
Na początku myślałem, że to działa, ale potem stwierdziłem, że nie. spróbuj wget " host.does.not.exist " -O "emptyFile" Zwracany jest błąd, ale tworzony jest pusty plik.
akurtser
1
@akurtser masz rację. Myślę, że nie ma sposobu, aby powiedzieć wget, aby nie tworzył pliku. Znalazłem ten wątek: mail-archive.com/[email protected]/msg08586.html, w którym dyskutują na ten temat. Podstawowa zasada polega na tym, że do tego samego pliku można MULTIPLE pobierać pliki, aby zostały utworzone, ponieważ wget nie może mieć pewności, że WSZYSTKIE adresy URL zawiodą.
Pan Shunz
Cóż, dziękuję, jest to część skryptu bash, który piszę, więc po prostu spróbuję najpierw zapisać plik tymczasowy, który w przypadku pomyślnego pobrania zostanie zmieniony. Niezbyt elegancki, ale nie mogę wymyślić nic lepszego.
akurtser
1
@akurtser Z pewnością możesz sprawdzić kod powrotu z wget, a następnie ... powinien powiedzieć, czy możesz usunąć plik „jeśli nie znaleziono”. Więc nie ma potrzeby temp / zmiany nazwy.
Pan Shunz
1
Opcja -O to przekierowanie, które przekierowuje pobraną zawartość do pliku, nawet w przypadku braku zawartości. Dlatego plik jest zawsze tworzony, nawet jeśli pobieranie się nie powiedzie.
Quan do
0

Zgodnie z dokumentem pomocy (wget -h) możesz użyć opcji --spider, aby pominąć pobieranie (wersja 1.14).

Download:
  -S,  --server-response         print server response.
       --spider                  don't download anything.

skalista qi
źródło