Làm cách nào để sử dụng wget với danh sách URL và tệp đầu ra tương ứng của chúng?


35

Giả sử list_of_urlsnhư thế này:

http://www.url1.com/some.txt
http://www.url2.com/video.mp4

Tôi biết cách sử dụng nó với:

wget -i list_of_urls

Nhưng, điều gì sẽ xảy ra nếu tôi list_of_urlscó cái này và tất cả chúng đều trả về các tệp thích hợp như PDF hoặc video:

http://www.url1.com/app?q=123&gibb=erish&gar=ble
http://www.url2.com/app?q=111&wha=tcha&mac=allit

Đối với một tệp duy nhất tôi có thể làm điều này:

wget -O some.txt "http://www.url1.com/app?q=123&gibb=erish&gar=ble"

Làm cách nào để sử dụng wgetđể tải xuống danh sách URL đó và lưu dữ liệu được trả về vào tệp cục bộ thích hợp?

Câu trả lời:


33

Theo mặc định, wget ghi vào một tệp có tên là thành phần cuối cùng của URL mà bạn chuyển đến nó. Nhiều máy chủ chuyển hướng URL như http://www.url1.com/app?q=123&gibb=erish&gar=blemột URL khác với tên tệp trông đẹp mắt như thế nào http://download.url1.com/files/something.pdf. Bạn có thể yêu cầu wget sử dụng tên từ URL được chuyển hướng (nghĩa là something.pdf) thay vì app?q=123&gibb=erish&gar=blechuyển --trust-server-namestùy chọn. Đây không phải là chế độ mặc định bởi vì, nếu sử dụng bất cẩn, nó có thể dẫn đến ghi đè tên tệp không thể đoán trước trong thư mục hiện tại; nhưng nếu bạn tin tưởng máy chủ hoặc đang làm việc trong một thư mục không chứa các tệp quý giá khác, --trust-server-namesthì đó thường là điều đúng đắn để sử dụng.

Một số máy chủ sử dụng Content-Dispositiontiêu đề thay vì chuyển hướng để chỉ định tên tệp. Vượt qua --content-dispositiontùy chọn để làm cho wget sử dụng tên tệp này.

Như vậy:

wget --content-disposition --trust-server-names -i list_of_urls

Nếu bạn vẫn không nhận được tên tệp trông đẹp mắt, bạn có thể muốn chỉ định tên riêng của mình. Giả sử bạn có một tệp chứa các dòng như

http://www.url1.com/app?q=123&gibb=erish&gar=ble foo.pdf
http://www.url2.com/app?q=111&wha=tcha&mac=allit bar.txt

Để làm cho wget tải các tệp vào tên tệp đã chỉ định, giả sử không có ký tự khoảng trắng trong URL hoặc trong tên tệp:

err=0
while read -r url filename tail; do
  wget -O "$filename" "$url" || err=1
done <list_of_urls_and_file_names

Các errbiến chứa 0 nếu tất cả các tải thành công và 1 nếu không, bạn có thể return $errnếu bạn đặt đoạn mã này trong một hàm hoặc exit $errnếu bạn đặt đoạn mã này trong một chuỗi.

Nếu bạn không muốn chỉ định bất kỳ thứ gì ngoài URL và bạn không thể nhận được tên đẹp từ máy chủ, bạn có thể đoán loại tệp và cố gắng nhận được ít nhất các tiện ích mở rộng có ý nghĩa.

err=0
n=1
while read -r url; do
  if wget -O tmpfile "$url"; then
    ext=data
    case $(file -i tmpfile) in
      application/pdf) ext=pdf;;
      image/jpeg) ext=jpg;;
      text/html) ext=html;;
      text/*) ext=txt;;
    esac
    mv tmpfile "$n.$ext"
  else
    err=1
  fi
  n=$((n+1))
done

Thêm các loại khác như mong muốn. Nếu filelệnh của bạn không có -mtùy chọn, hãy bỏ qua nó và kiểm tra xem filetrả về hệ thống nào cho các loại tệp bạn quan tâm. Nếu bạn có tệp /etc/mime.typestrên hệ thống của mình, bạn có thể đọc các liên kết của các loại MIME cho các tiện ích mở rộng từ nó thay vì cung cấp danh sách của riêng bạn:

n=1
while read -r url; do
  if wget -O tmpfile "$url"; then
    mime_type=$(file -m tmpfile)
    ext=$(awk "$1 == \"$mime_type\" {print \$2; exit} END {print \"data\"}" /etc/mime.types)
    mv tmpfile "$n.$ext"
  else
    err=1
  fi
  n=$((n+1))
done

2

Bạn có thể lặp qua các mục trong của bạn list_of_urls. Một cái gì đó như thế này:

while read -r url; do
    wget -O foo $url
done < list_of_urls

Lưu ý rằng bạn sẽ phải thêm cách xác định của riêng mình foocho mỗi mục nhập của list_of_urls(đồng thời, tôi cho rằng đây là một tệp trên đĩa của bạn).


Đây là một biến thể về điều đó: tạo một tập lệnh nhỏ với một dòng wget -O $2 $1. Trong tập tin list_of_urls, làm cho mỗi dòng một url, khoảng trắng, một tên tập tin (ví dụ http://url1/blah&blah=whatever some.pdfSau đó sử dụng tương tự như trên, thay thế cho dòng wget với. ./thatscript.sh $urlTrong trường hợp này. $urlThực sự là một phù hợp với một url và một tên tập tin, tất nhiên.
Goldilocks

2
Biến thể 2: Đặt các url và tên tệp trên các dòng riêng biệt, xen kẽ trong tệp list_of_urls, sau đó sử dụng while read url; do read filename; wget -O $filename $url; done < list_of_urls.
goldilocks

2

Bạn có thể trực tiếp sử dụng wgettùy chọn:

wget -r -i list_of_urls

Điều này không hoạt động: -rcho phép tải về đệ quy. Tên tệp không được đặt chính xác.
jofel
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.