เขียนเอาต์พุตของ wget หรือ curl ไปยังชื่อไฟล์ที่กำหนดเองตาม url


12

http://www.abc.com/123/def/ghi/jkl.mnoเช่นฉันมีการเชื่อมโยง ฉันต้องการดาวน์โหลดโดยใช้wgetหรือcurlรับชื่อของไฟล์ที่ส่งออกdef_ghi_jkl.mnoซึ่งเป็นส่วนที่def_ghiนำมาจากลิงค์

ฉันจะใส่wgetคำสั่งนี้ในสคริปต์เพื่อดาวน์โหลดหลายไฟล์ดังนั้นจึงไม่สามารถให้ชื่อไฟล์ที่ส่งออกได้อย่างชัดเจน

คำตอบ:


15

curlมี-o, ตัวเลือกซึ่งจะมีอาร์กิวเมนต์เดียวที่ระบุเอาท์พุทชื่อไฟล์ที่ควรจะเขียนไปแทน--output stdoutหากคุณกำลังใช้{}หรือ[]ล้อมรอบองค์ประกอบใน URL (โดยปกติจะใช้เพื่อดึงเอกสารหลายฉบับ) คุณสามารถใช้#ตามด้วยตัวเลขในตัวระบุชื่อไฟล์ แต่ละตัวแปรดังกล่าวจะถูกแทนที่ด้วยสตริงที่เกี่ยวข้องสำหรับ URL ที่ถูกดึงมา {}สามารถดึงข้อมูลหลายไฟล์เพิ่มรายการคั่นด้วยเครื่องหมายจุลภาคของสัญญาณภายใน หากชิ้นส่วนของ URL []จะถูกดึงมาเป็นตัวเลขลำดับคุณสามารถระบุช่วงที่มี

ตัวอย่าง:

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

หมายเหตุ: คำพูดรอบอาร์กิวเมนต์ตัวเลือก (ไม่จำเป็นต้องยกเว้นกรณีที่ชื่อไฟล์ที่จะเริ่มต้นกับหนึ่งในตัวแปรที่ขยาย) def_ghi_jkl.mnoครั้งนี้จะส่งผลให้การส่งออกไฟล์

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

นี้จะส่งผลให้ไฟล์ที่ส่งออก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'

นี้จะส่งผลให้การส่งออกไฟล์def_ghi_1.mno, ,def_ghi_2.mnodef_ghi_3.mno


2

wgetมีสวิตช์-O(แบบยาว--output-document) ซึ่งอนุญาตให้คุณระบุชื่อไฟล์ที่จะบันทึก (สันนิษฐานว่าขดมีบางอย่างที่คล้ายกัน) ดังนั้นคุณสามารถทำ:

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

และมันจะทำสิ่งที่คุณต้องการ

คุณอาจจะสร้างเสื้อคลุมรอบ wget ถ้าคุณต้องการทำให้รูปแบบการตั้งชื่อนี้โดยอัตโนมัติ แต่มันก็ค่อนข้างยากที่จะได้รับการพิสูจน์หัวข้อย่อยและอยู่นอกขอบเขตของคำตอบนี้ (กรณีง่าย ๆ ของไฟล์เดียวที่ดาวน์โหลดจาก URL ที่ชัดเจนไม่ควรยากเกินไปที่จะได้รับสิทธิ์ แต่นั่นไม่ใช่โหมดการทำงานเพียงอย่างเดียวของ wget หากต้องการตั้งชื่อกรณีเดียวที่ทำให้ไม่น่าสนใจเล็กน้อยคุณสามารถระบุหลาย URL ได้ บนบรรทัดคำสั่ง)

โปรดทราบว่า-Oไม่เหมือนกันทั้งหมด-oซึ่งเป็นเอาต์พุตของwgetของการเขียนไปยังไฟล์ที่ระบุชื่อ


มันเป็นส่วนหนึ่งของสคริปต์ให้ชื่อไฟล์อย่างชัดเจนว่าจะไม่ทำงาน
gvz

@ user47567 ทำไมล่ะ สิ่งที่เกี่ยวกับความจริงที่ว่า wget หรือ curl ถูกเรียกจากสคริปต์ทำให้สิ่งนี้ทำไม่ได้? (และถ้าคุณมีข้อ จำกัด เช่นนี้เกี่ยวกับสิ่งที่คำตอบจะใช้งานได้ข้อมูลดังกล่าวควรเป็นคำถามตั้งแต่ต้น)
CVn

0

นี่คือเคล็ดลับการทดแทน 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}จะลบ " http://www.abc.com/123/ " มันเป็น${parameter:offset:length}แล้วtrจะเข้ามาแทนที่การ/_

ดังนั้นตอนนี้คุณสามารถใช้กับ wget หรือขดได้อย่างง่ายดาย

wget $link  -O $OutputFile

นอกจากนี้เรายังสามารถใช้ awk ซึ่งจะแยกสามไฟล์สุดท้ายจากสตริงอินพุต:

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

0

ชื่อไฟล์ที่คุณต้องการไม่สามารถรับได้ด้วยwgetตัวเองดังนั้นจึงต้องมีการจัดการโดยเชลล์สคริปต์:

$ 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"

หรือถ้าคุณชอบมันเป็นหนึ่งบรรทัด:

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

0

ถ้าคุณชอบขดทางที่ตรงที่สุดคือ:

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

ชื่อไฟล์: ชื่อของไฟล์ที่ดาวน์โหลด

รหัสไฟล์: รหัสของไฟล์ในมุมมองเว็บของ Google ไดรฟ์ในรูปแบบhttps://drive.google.com/file/d/ รหัสไฟล์ / มุมมอง

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.