Viết đầu ra của wget hoặc curl vào một tên tệp tùy chỉnh dựa trên url


12

Ví dụ tôi có một liên kết http://www.abc.com/123/def/ghi/jkl.mno. Tôi muốn tải xuống bằng cách sử dụng wgethoặc curllấy tên của tệp đầu ra là def_ghi_jkl.mno, trong đó phần def_ghiđược lấy từ liên kết.

Tôi sẽ đặt wgetlệnh này trong một tập lệnh để tải xuống nhiều tệp để nó không thể đưa ra tên tệp đầu ra một cách rõ ràng.

Câu trả lời:


15

curl-o, --output tùy chọn mà phải mất một đối số duy nhất cho thấy sản lượng filename nên được ghi vào thay stdout. Nếu bạn đang sử dụng {}hoặc []để bao quanh các thành phần trong URL (thường được sử dụng để tìm nạp nhiều tài liệu), bạn có thể sử dụng #theo sau là một số trong công cụ xác định tên tệp. Mỗi biến như vậy sẽ được thay thế bằng chuỗi tương ứng cho URL được tìm nạp. Để tìm nạp nhiều tệp, hãy thêm danh sách mã thông báo được phân tách bằng dấu phẩy bên trong {}. Nếu các phần của URL được tìm nạp là các số liên tiếp, bạn có thể chỉ định một phạm vi với [].

Ví dụ:

  curl http://www.abc.com/123/{def}/{ghi}/{jkl}.mno -o '#1_#2_#3.mno'

Lưu ý các trích dẫn xung quanh đối số tùy chọn (không cần thiết trừ khi tên tệp bắt đầu bằng một trong các biến được mở rộng). Điều này sẽ dẫn đến tệp đầu ra def_ghi_jkl.mno.

  curl http://www.abc.com/123/{def}/{ghi}/{jkl,pqr,stu}.mno -o '#1_#2_#3.mno'

Điều này sẽ dẫn đến các tập tin đầu ra def_ghi_jkl.mno, def_ghi_pqr.mnodef_ghi_stu.mno.

 curl http://www.abc.com/123/{def}/{ghi}/[1-3].mno -o '#1_#2_#3.mno'

Điều này sẽ dẫn đến các tập tin đầu ra def_ghi_1.mno, def_ghi_2.mno, def_ghi_3.mno.


2

wgetcó một công tắc -O(dạng dài --output-document) cho phép bạn chỉ định tên của tệp để lưu vào. (Có lẽ curl có một cái gì đó tương tự.) Vì vậy, bạn có thể làm:

wget -O def_ghi_jkl.mno http://www.abc.com/123/def/ghi/jkl.mno

và nó sẽ làm những gì bạn muốn.

Bạn có thể có thể tạo một trình bao bọc xung quanh wget nếu bạn muốn tự động hóa sơ đồ đặt tên này, nhưng sẽ khá khó để có được chống đạn và chắc chắn nằm ngoài phạm vi của câu trả lời này. (Trường hợp đơn giản của một tệp được tải xuống từ một URL rõ ràng sẽ không khó để xử lý đúng, nhưng đó không phải là phương thức hoạt động duy nhất. Để đặt tên chỉ một trường hợp làm cho điều này không tầm thường, bạn có thể chỉ định nhiều URL trên dòng lệnh.)

Lưu ý rằng hoàn toàn -Okhông giống nhau -o, ghi đầu ra của wget vào tệp được đặt tên.


Đó là một phần của tập lệnh, đưa ra tên tệp rõ ràng như thế sẽ không hoạt động.
gvz

@ user48567 Tại sao không? Điều gì về thực tế là wget hoặc curl đang được gọi từ một kịch bản làm cho điều này không thực tế? (Và thực sự, nếu bạn có những ràng buộc như vậy về câu trả lời nào sẽ hoạt động, thông tin đó sẽ thực sự đi vào câu hỏi ngay từ đầu.)
CVn

0

Đây là một số mẹo thay thế Bash

link="http://www.abc.com/123/def/ghi/jkl.mno"
OutputFile=$( echo ${link:23: 23}| tr "/" "_" )
echo $OutputFile
def_ghi_jkl.mno

{$link:23: 23}sẽ loại bỏ " http://www.abc.com/123/ " đó là ${parameter:offset:length}, sau đó trsẽ thay thế /cho _.

Vì vậy, bây giờ bạn có thể dễ dàng sử dụng với wget hoặc curl

wget $link  -O $OutputFile

Ngoài ra chúng ta có thể sử dụng awk, điều này sẽ trích xuất ba lần gửi cuối cùng từ chuỗi đầu vào:

OutputFile=$( echo $link | awk -F/ 'BEGIN{OFS="_"}{ print $( NF-2),$(NF - 1 ),$NF}' )

0

Tên tệp bạn cần không thể được lấy từ wgetchính nó, vì vậy nó cần được xử lý bằng tập lệnh shell:

$ url='http://www.example.com/123/def/ghi/jkl.mno'
$ outFile=$(echo "$url" | cut -d /  -f 5- | tr / _)
$ echo $outFile 
def_ghi_jkl.mno
$ wget "$url" -O "$outFile"

Hoặc nếu bạn thích nó như một dòng:

wget "$url" -O "$(echo "$url" | cut -d /  -f 5- | tr / _)"

0

Nếu bạn thích uốn xoăn, cách trực tiếp nhất là:

curl -L -o <filename> "https://drive.google.com/uc?export=download&id=<file id>"

tên tệp: tên của tệp đã tải xuống

id tệp: id của tệp trong chế độ xem web của ổ đĩa google ở ​​định dạng https://drive.google.com/file/d/ id id / view

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.