Jak mogę ograniczyć rozmiar pobieranego pliku we wget?


13

Chcę używać wget(ze skryptu php) do pobierania plików obrazów, ale nie chcę pobierać plików o określonym rozmiarze.

Czy mogę ograniczyć rozmiar pliku wget? Jeśli nie, jaki jest lepszy sposób?

Odpowiedzi:


14

Jeśli piszesz pliki do pobrania, powinieneś rozważyć użycie curlzamiast tego. Wget może analizować dane wyjściowe i rekurencyjnie pobierać całe witryny, ale curl ma znacznie więcej opcji związanych z faktycznym pobieraniem określonego pliku. Oto odpowiednia opcja na stronie man:

--max-filesize
Podaj maksymalny rozmiar (w bajtach) pliku do pobrania. Jeśli żądany plik jest większy niż ta wartość, przesyłanie nie rozpocznie się, a curl powróci z kodem wyjścia 63.
UWAGA: Rozmiar pliku nie zawsze jest znany przed pobraniem, a dla takich plików ta opcja nie działa, nawet jeśli plik transfer ostatecznie jest większy niż ten limit.

Warto zwrócić uwagę na to, że działa tylko w przypadku niektórych plików. Klient jest zależny od serwera, aby zgłosić, jak duży będzie plik, zanim rozpocznie się pobieranie. Większość, ale z pewnością nie wszystkie serwery to zgłaszają.


6
Można połączyć to z limitem systemu zabronić pozwijane od stworzenia pliku większego niż $nbajtów: (ulimit -f $(($n/512)); curl --max-filesize $n …). curlprzerwie z błędem, jeśli rozmiar pliku przekroczy $n/512512-bajtowe bloki.
Gilles „SO- przestań być zły”,

Możesz także httrack.
Vi.

6

Jeśli chcesz korzystać z wget, oto sposób na przetestowanie rozmiaru pliku bez pobierania:

wget --spider $URL 2>&1 | awk '/Length/ {print $2}'

gdzie $URLjest oczywiście adres URL pliku, który chcesz pobrać.

Możesz więc warunkować swój skrypt na podstawie danych wyjściowych. Jak na przykład:

{ [ $(wget --spider $URL 2>&1 | awk '/Length/ {print $2}') -lt 20971520 ] && wget $URL; } || echo file to big

do ograniczenia wielkości pobierania do 20 MB.

(kod jest brzydki, wyłącznie w celach informacyjnych).


1

Wydaje się, że nie ma rozsądnego sposobu na ustawienie maksymalnego rozmiaru pliku za pomocą wget.


2
Podejście Gillesa z ulimit(patrz bash(1), setrlimit(2)) również będzie działać wget(1), choć jest nieco ciężkie.
sarnold

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.