ฉันจะใช้ wget กับรายการ URL และไฟล์เอาต์พุตที่เกี่ยวข้องได้อย่างไร


35

สมมติว่าlist_of_urlsมีลักษณะเช่นนี้:

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

ฉันรู้วิธีใช้สิ่งนั้นด้วย:

wget -i list_of_urls

แต่ถ้าฉันlist_of_urlsมีสิ่งนี้และพวกเขาทั้งหมดกลับไฟล์ที่เหมาะสมเช่น PDF หรือวิดีโอ:

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

สำหรับไฟล์เดียวฉันสามารถทำได้:

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

ฉันจะใช้wgetเพื่อดาวน์โหลดรายการ URL นั้นและบันทึกข้อมูลที่ส่งคืนไปยังไฟล์ในเครื่องที่เหมาะสมได้อย่างไร

คำตอบ:


33

โดยค่าเริ่มต้น wget เขียนไปยังไฟล์ที่มีชื่อเป็นองค์ประกอบสุดท้ายของ URL ที่คุณส่งไป เซิร์ฟเวอร์หลายแห่งเปลี่ยนเส้นทาง URL http://www.url1.com/app?q=123&gibb=erish&gar=bleไปยัง URL อื่นด้วยชื่อไฟล์ที่ดูhttp://download.url1.com/files/something.pdfดี คุณสามารถบอกให้ wget ใช้ชื่อจาก URL ที่ถูกเปลี่ยนเส้นทาง (เช่นsomething.pdf) แทนที่จะapp?q=123&gibb=erish&gar=bleส่ง--trust-server-namesตัวเลือก นี่ไม่ใช่โหมดเริ่มต้นเพราะหากใช้อย่างไม่ระมัดระวังอาจทำให้เกิดการเขียนทับชื่อไฟล์ที่ไม่สามารถคาดเดาได้ในไดเรกทอรีปัจจุบัน แต่ถ้าคุณเชื่อถือเซิร์ฟเวอร์หรือทำงานในไดเรกทอรีที่ไม่มีไฟล์ที่มีค่าอื่น ๆ--trust-server-namesมักจะเป็นสิ่งที่ถูกต้องที่จะใช้

เซิร์ฟเวอร์บางเครื่องใช้Content-Dispositionส่วนหัวแทนการเปลี่ยนเส้นทางเพื่อระบุชื่อไฟล์ ผ่าน--content-dispositionตัวเลือกเพื่อให้ wget ใช้ชื่อไฟล์นี้

ดังนั้น:

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

หากคุณยังไม่ได้รับชื่อไฟล์ที่ดูดีคุณอาจต้องการระบุชื่อของคุณเอง สมมติว่าคุณมีไฟล์ที่มีบรรทัดเช่น

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

เพื่อให้ wget ดาวน์โหลดไฟล์ไปยังชื่อไฟล์ที่ระบุสมมติว่าไม่มีตัวอักษรช่องว่างใน URL หรือในชื่อไฟล์:

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

errตัวแปรมี 0 ถ้าการดาวน์โหลดทั้งหมดประสบความสำเร็จและ 1 มิฉะนั้นคุณสามารถreturn $errถ้าคุณวางข้อมูลนี้ในการทำงานหรือexit $errถ้าคุณวางข้อมูลนี้ในสตริง

หากคุณไม่ต้องการระบุสิ่งอื่นนอกจาก URL และคุณไม่สามารถรับชื่อที่ดีจากเซิร์ฟเวอร์คุณสามารถเดาประเภทไฟล์และพยายามรับส่วนขยายที่มีความหมายอย่างน้อย

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

เพิ่มประเภทอื่น ๆ ตามที่ต้องการ หากfileคำสั่งของคุณไม่มี-mตัวเลือกให้ปล่อยไว้และตรวจสอบสิ่งที่fileส่งคืนในระบบของคุณสำหรับประเภทไฟล์ที่คุณสนใจหากคุณมีไฟล์/etc/mime.typesในระบบของคุณคุณสามารถอ่านการเชื่อมโยงของประเภท MIME กับส่วนขยายได้จาก แทนที่จะส่งรายชื่อของคุณเอง:

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

list_of_urlsคุณสามารถห่วงมากกว่ารายการในของคุณ บางสิ่งเช่นนี้

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

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


นี่เป็นรูปแบบที่หลากหลายที่: สร้างสคริปต์เล็ก ๆ น้อย ๆ wget -O $2 $1กับหนึ่งบรรทัด ในไฟล์ list_of_urls ให้แต่ละบรรทัดเป็น url, whitespace, ชื่อไฟล์ (เช่นhttp://url1/blah&blah=whatever some.pdfจากนั้นใช้เหมือนข้างบนแทนที่ wget line ด้วย./thatscript.sh $urlในกรณี$urlนี้จริง ๆ แล้วเป็นบรรทัดที่มี url และชื่อไฟล์แน่นอน
goldilocks

2
การเปลี่ยนแปลงที่ 2: ใส่ URL ที่และชื่อไฟล์บนแยกต่างหากเส้นสลับในแฟ้ม list_of_urls while read url; do read filename; wget -O $filename $url; done < list_of_urlsแล้วการใช้งาน
goldilocks

2

คุณสามารถใช้wgetตัวเลือกโดยตรง:

wget -r -i list_of_urls

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