wget với ký tự đại diện trong tải xuống http


53

Tôi cần tải xuống một tệp bằng wget, tuy nhiên tôi không biết chính xác tên tệp sẽ là gì.

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

Theo trang man , wget cho phép bạn tắt và bật toàn cầu khi giao dịch với trang web ftp, tuy nhiên tôi có url http.

Làm thế nào tôi có thể sử dụng ký tự đại diện trong khi sử dụng wget? Tôi đang sử dụng gnu wget.

Những điều tôi đã thử.

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

Cập nhật

Việc sử dụng -A khiến tất cả các tệp kết thúc bằng .tar.gz trên máy chủ được tải xuống.

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

Cập nhật

Từ các câu trả lời, đây là cú pháp cuối cùng đã làm việc.

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

2
Đây không phải là chính xác những gì bạn đang tìm kiếm nhưng nó có liên quan: Curl có khả năng sử dụng các ký tự đại diện cơ bản, ví dụ:curl "http://example.com/picture[1-10].jpg" -o "picture#1.jpg"
Xin chào Thế giới

1
Một điều đáng chú ý đối với tôi là -e robots=offtham số không tuân theo robot.txt: stackoverflow.com/a/11124664/1097104
Juuso Ohtonen

Tôi thấy việc thêm cờ -nH--cut-dirs=<number>cũng hữu ích
Randall

Câu trả lời:


62

Tôi nghĩ những công tắc này sẽ làm những gì bạn muốn với 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.

Thí dụ

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

15

Có một lý do chính đáng là điều này không thể hoạt động trực tiếp với HTTP và đó là URL không phải là đường dẫn tệp, mặc dù việc sử dụng /như một dấu phân cách có thể làm cho nó trông giống như một và đôi khi chúng tương ứng. 1

Thông thường (hoặc, trong lịch sử), các máy chủ web thường thực hiện phân cấp thư mục nhân bản (đối với một số - ví dụ: Apache - đây là loại tích phân) và thậm chí cung cấp các chỉ mục thư mục giống như một hệ thống tệp. Tuy nhiên, không có gì về giao thức HTTP yêu cầu điều này.

Đây là quan trọng, bởi vì nếu bạn muốn áp dụng một glob trên nói, tất cả mọi thứ mà là một subpath của http://foo/bar/, trừ khi các máy chủ cung cấp một số cơ chế để cung cấp cho bạn như vậy (ví dụ như chỉ số nói trên), không có gì để áp dụng nó glob là để . Không có hệ thống tập tin ở đó để tìm kiếm. Ví dụ: chỉ vì bạn biết có các trang http://foo/bar/one.htmlhttp://foo/bar/two.htmlkhông có nghĩa là bạn có thể nhận được danh sách các tệp và thư mục con thông qua http://foo/bar/. Nó sẽ hoàn toàn nằm trong giao thức để máy chủ trả về 404 cho điều đó. Hoặc nó có thể trả về một danh sách các tập tin. Hoặc nó có thể gửi cho bạn một hình ảnh jpg tốt đẹp. Vân vân.

Vì vậy, không có tiêu chuẩn ở đây wgetcó thể khai thác. AFAICT, wget hoạt động để phản ánh hệ thống phân cấp đường dẫn bằng cách chủ động kiểm tra các liên kết trong mỗi trang . Nói cách khác, nếu bạn phản chiếu đệ quy http://foo/bar/index.htmlnó sẽ tải xuống index.htmlvà sau đó trích xuất các liên kết là một nhánh con của điều đó. 2 Công -Atắc chỉ đơn giản là một bộ lọc được áp dụng trong quy trình này.

Nói tóm lại, nếu bạn biết những tập tin này được lập chỉ mục ở đâu đó, bạn có thể bắt đầu với việc sử dụng nó -A. Nếu không, thì bạn đã hết may mắn.


1. Tất nhiên một URL FTP cũng là một URL. Tuy nhiên, trong khi tôi không biết nhiều về giao thức FTP, tôi đoán dựa trên bản chất của nó rằng nó có thể là một hình thức cho phép tạo khối trong suốt.

2. này có nghĩa rằng có thể có một URL hợp lệ http://foo/bar/alt/whatever/stuff/đó sẽ không được tính vì nó không có trong bất kỳ cách nào liên quan đến bất cứ điều gì trong tập hợp các điều liên quan đến http://foo/bar/index.html. Không giống như các hệ thống tập tin, các máy chủ web không bắt buộc phải làm cho bố cục nội dung của chúng trở nên trong suốt, cũng như không cần phải làm điều đó theo một cách trực quan rõ ràng.


0

Giải pháp '-Một mẫu' ở trên có thể không hoạt động với một số trang web. Đây là công việc của tôi, với một wget đôi:

  1. wget trang
  2. grep cho mẫu
  3. wget Tập tài liệu)

Ví dụ: giả sử đó là trang podcast tin tức và tôi muốn có 5 tệp mp3 từ đầu trang:

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

Họ grepđang tìm kiếm các liên kết không có không gian được trích dẫn có chứa ://và tên tệp của tôi pattern.


RANDOM ở đây là gì?
royki

Một biến vỏ, xem bashtrang người đàn ông. RANDOM Mỗi khi tham số này được tham chiếu, một số nguyên ngẫu nhiên trong khoảng từ 0 đến 32767 được tạo.
nighthift
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.