wget dengan wildcard dalam unduhan http

53

Saya perlu mengunduh file menggunakan wget, namun saya tidak tahu persis nama file itu.

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

Menurut halaman manual , wget memungkinkan Anda mematikan dan menghidupkan globbing ketika berhadapan dengan situs ftp, namun saya memiliki url http.

Bagaimana saya bisa menggunakan wildcard saat menggunakan wget? Saya menggunakan gnu wget.

Hal yang sudah saya coba.

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

Memperbarui

Menggunakan -A menyebabkan semua file yang berakhiran .tar.gz di server diunduh.

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

Memperbarui

Dari jawaban, ini adalah sintaks yang akhirnya berhasil.

/usr/local/bin/wget -r -l1 -np "https://foo" -P /tmp -A "bar*.tar.gz"
spuder
sumber
2
Ini bukan apa yang Anda cari, tetapi itu terkait: Curl memiliki kemampuan untuk menggunakan wildcard dasar, misalnya:curl "http://example.com/picture[1-10].jpg" -o "picture#1.jpg"
Hello World
1
Satu yang saya -e robots=off
dapatkan
Saya menemukan menambahkan bendera -nHdan --cut-dirs=<number>juga berguna
Randall

Jawaban:

62

Saya pikir switch ini akan melakukan apa yang Anda inginkan 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.

Contoh

$ wget -r --no-parent -A 'bar.*.tar.gz' http://url/dir/
slm
sumber
15

Ada alasan bagus bahwa ini tidak dapat bekerja secara langsung dengan HTTP, dan itu adalah bahwa URL bukan path file, meskipun penggunaan /sebagai pembatas dapat membuatnya terlihat seperti satu, dan mereka kadang-kadang sesuai. 1

Secara konvensional (atau, secara historis), server web sering melakukan hierarki direktori mirror (untuk beberapa - misalnya, Apache - ini semacam integral) dan bahkan menyediakan indeks direktori seperti sistem file. Namun, tidak ada yang perlu tentang protokol HTTP ini.

Ini penting, karena jika Anda ingin menerapkan glob di katakan, segala sesuatu yang merupakan subpath dari http://foo/bar/, kecuali server menyediakan beberapa mekanisme untuk menyediakan Anda dengan (misalnya indeks tersebut), tidak ada yang menerapkan glob untuk . Tidak ada sistem file di sana untuk dicari. Misalnya, hanya karena Anda tahu ada halaman http://foo/bar/one.htmldan http://foo/bar/two.htmltidak berarti Anda bisa mendapatkan daftar file dan subdirektori melalui http://foo/bar/. Ini akan sepenuhnya dalam protokol untuk server mengembalikan 404 untuk itu. Atau bisa mengembalikan daftar file. Atau bisa mengirimi Anda gambar jpg yang bagus. Dll

Jadi tidak ada standar di sini yang wgetbisa mengeksploitasi. AFAICT, wget berfungsi untuk mencerminkan hierarki jalur dengan secara aktif memeriksa tautan di setiap halaman . Dengan kata lain, jika Anda secara mirroring mirror http://foo/bar/index.htmlitu mengunduh index.htmldan kemudian mengekstrak tautan yang merupakan subpath dari itu. 2 The -Asaklar hanyalah sebuah filter yang diterapkan dalam proses ini.

Singkatnya, jika Anda tahu file-file ini diindeks di suatu tempat, Anda bisa mulai menggunakan itu -A. Jika tidak, maka Anda kurang beruntung.


1. Tentu saja URL FTP juga URL. Namun, sementara saya tidak tahu banyak tentang protokol FTP, saya kira berdasarkan sifatnya itu mungkin dari bentuk yang memungkinkan untuk globbing transparan.

2. Ini berarti bahwa mungkin ada URL http://foo/bar/alt/whatever/stuff/yang valid yang tidak akan dimasukkan karena sama sekali tidak terkait dengan apa pun dalam rangkaian hal yang ditautkan http://foo/bar/index.html. Tidak seperti sistem file, server web tidak berkewajiban untuk membuat tata letak konten mereka transparan, mereka juga tidak perlu melakukannya dengan cara yang jelas secara intuitif.

goldilocks
sumber
0

Solusi '-A pola' di atas mungkin tidak berfungsi dengan beberapa halaman web. Ini adalah pekerjaan saya, dengan double wget:

  1. wget halaman
  2. grep untuk pola
  3. wget file

Contoh: misalkan ini halaman podcast berita, dan saya ingin 5 file mp3 dari atas halaman:

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

Mereka grepmencari tautan tanpa spasi yang dikutip ganda yang berisi ://dan nama file saya pattern.

nighthift
sumber
apa ACAK di sini?
royki
Variabel shell, lihat bashhalaman manual. ACAK Setiap kali parameter ini direferensikan, bilangan bulat acak antara 0 dan 32767 dihasilkan.
nightshift