wget z symbolami wieloznacznymi w pobieraniu http

53

Muszę pobrać plik za pomocą wget, ale nie wiem dokładnie, jaka będzie nazwa tego pliku.

https://foo/bar.1234.tar.gz

Według strony man , wget pozwala włączyć i wyłączyć globbing gdy ma do czynienia z serwera ftp, jednak mam URL http.

Jak mogę użyć symbolu wieloznacznego podczas używania wget? Używam wget GNU.

Rzeczy, których próbowałem.

/usr/local/bin/wget -r "https://foo/bar.*.tar.gz" -P /tmp

Aktualizacja

Użycie -A powoduje pobranie wszystkich plików z rozszerzeniem .tar.gz na serwerze.

/usr/local/bin/wget -r "https://foo/" -P /tmp -A "bar.*.tar.gz"

Aktualizacja

Z odpowiedzi wynika, że ​​jest to składnia, która ostatecznie zadziałała.

/usr/local/bin/wget -r -l1 -np "https://foo" -P /tmp -A "bar*.tar.gz"
spuder
źródło
2
Nie jest to dokładnie to, czego szukasz, ale jest powiązane: Curl ma możliwość korzystania z podstawowych symboli wieloznacznych, np .:curl "http://example.com/picture[1-10].jpg" -o "picture#1.jpg"
Hello World,
1
Jednym z moich -e robots=off
problemów
Znalazłem dodawanie flag -nHi przydałem się --cut-dirs=<number>także
Randall

Odpowiedzi:

62

Myślę, że te przełączniki będą robić, co chcesz wget:

   -A acclist --accept acclist
   -R rejlist --reject rejlist
       Specify comma-separated lists of file name suffixes or patterns to 
       accept or reject. Note that if any of the wildcard characters, *, ?,
       [ or ], appear in an element of acclist or rejlist, it will be 
       treated as a pattern, rather than a suffix.

   --accept-regex urlregex
   --reject-regex urlregex
       Specify a regular expression to accept or reject the complete URL.

Przykład

$ wget -r --no-parent -A 'bar.*.tar.gz' http://url/dir/
slm
źródło
15

Jest dobry powód, dla którego nie może to działać bezpośrednio z HTTP, i dlatego, że URL nie jest ścieżką do pliku, chociaż użycie /jako separatora może sprawić, że będzie wyglądać jak jeden, i czasami się zgadzają. 1

Tradycyjnie (lub historycznie) serwery sieciowe często wykonują lustrzane hierarchie katalogów (dla niektórych - np. Apache - jest to rodzaj integralności), a nawet zapewniają indeksy katalogów podobne do systemu plików. Nic jednak nie wymaga tego w protokole HTTP.

Jest to istotne, ponieważ jeśli chcesz zastosować glob na powiedzmy, wszystko co jest podścieżkę z http://foo/bar/, chyba że serwer zapewnia pewien mechanizm, aby zapewnić Państwu taki (np wspomnianego indeksu), nie ma nic, aby zastosować go do glob do . Nie ma tam systemu plików do przeszukiwania. Na przykład tylko dlatego, że wiesz, że istnieją strony http://foo/bar/one.htmli http://foo/bar/two.htmlnie oznacza to, że możesz uzyskać listę plików i podkatalogów za pośrednictwem http://foo/bar/. Byłoby całkowicie w ramach protokołu, aby serwer zwrócił za to 404. Lub może zwrócić listę plików. Lub może wysłać ci ładne zdjęcie jpg. Itp.

Więc nie ma tutaj standardu, który wgetmógłby wykorzystać. AFAICT, wget działa w celu odzwierciedlenia hierarchii ścieżek poprzez aktywne sprawdzanie linków na każdej stronie . Innymi słowy, jeśli rekurencyjnie dublujesz, http://foo/bar/index.htmlpobiera, index.htmla następnie wyodrębnia linki, które są jego podścieżką. 2-A przełącznik jest jedynie filtrem, który jest stosowany w tym procesie.

Krótko mówiąc, jeśli wiesz, że te pliki są gdzieś indeksowane, możesz zacząć od tego za pomocą -A. Jeśli nie, to nie masz szczęścia.


1. Oczywiście adres URL FTP również jest adresem URL. Jednak chociaż nie wiem dużo o protokole FTP, sądzę, że w oparciu o jego naturę może on mieć formę, która pozwala na transparentne globowanie.

2. Oznacza to, że może istnieć prawidłowy adres URL http://foo/bar/alt/whatever/stuff/, który nie zostanie dołączony, ponieważ nie jest w żaden sposób powiązany z niczym w zbiorze rzeczy, z którymi jest powiązany http://foo/bar/index.html. W przeciwieństwie do systemów plików, serwery sieciowe nie są zobowiązane do zapewnienia przejrzystości układu treści, ani nie muszą tego robić w sposób intuicyjny.

Złotowłosa
źródło
0

Powyższe rozwiązanie „-Wzór” może nie działać na niektórych stronach internetowych. Oto moje obejście z podwójnym wgetem:

  1. wget Strona
  2. grep na wzór
  3. wget pliki)

Przykład: załóżmy, że jest to strona z wiadomościami i chcę 5 plików mp3 od góry strony:

wget -nv -O- https://example/page/ |
 grep -o '[^"[:space:]]*://[^"[:space:]]*pattern[^"[:space:]]*\.mp3' |
  head -n5 | while read x; do
    sleep $(($RANDOM % 5 + 5))  ## to appear gentle and polite
    wget -nv "$x"
  done

grepSzuka powiązań podwójnie cytowany No-kosmicznych, które zawierają ://i mojej nazwy pliku pattern.

nocna zmiana
źródło
czym jest tutaj LOSOWO?
royki
Zmienna powłoki, patrz bashstrona man. RANDOM Za każdym razem, gdy odwołuje się do tego parametru, generowana jest losowa liczba całkowita od 0 do 32767.
nocna zmiana