wget with wildcard ในการดาวน์โหลด http


53

ฉันต้องดาวน์โหลดไฟล์โดยใช้ wget แต่ฉันไม่รู้ว่าชื่อไฟล์จะเป็นอะไร

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

ตามหน้า man , wget ช่วยให้คุณสามารถปิดและ globbing เมื่อจัดการกับเว็บไซต์ ftp แต่ฉันมี URL http

ฉันจะใช้ไวด์การ์ดในขณะที่ใช้ wget ได้อย่างไร ฉันใช้ gnu wget

สิ่งที่ฉันได้ลอง

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

ปรับปรุง

การใช้ -A จะทำให้ไฟล์ทั้งหมดลงท้ายด้วย. tar.gz บนเซิร์ฟเวอร์เพื่อทำการดาวน์โหลด

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

ปรับปรุง

จากคำตอบนี่คือไวยากรณ์ที่ใช้งานได้ในที่สุด

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

2
นี่ไม่ใช่สิ่งที่คุณกำลังมองหา แต่เกี่ยวข้องกับ: Curl มีความสามารถในการใช้สัญลักษณ์แทนขั้นพื้นฐานเช่น:curl "http://example.com/picture[1-10].jpg" -o "picture#1.jpg"
Hello World

1
Gotcha หนึ่งตัวสำหรับฉันคือ-e robots=offพารามิเตอร์ที่ไม่เชื่อฟัง robots.txt: stackoverflow.com/a/11124664/1097104
Juuso Ohtonen

ฉันพบการเพิ่มธง-nHและ--cut-dirs=<number>มีประโยชน์ด้วย
Randall

คำตอบ:


62

ฉันคิดว่าสวิตช์เหล่านี้จะทำสิ่งที่คุณต้องการด้วย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.

ตัวอย่าง

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

15

มีเหตุผลที่ดีที่สิ่งนี้ไม่สามารถทำงานได้โดยตรงกับ HTTP และนั่นคือ URL ไม่ใช่เส้นทางไฟล์แม้ว่าการใช้/ตัวคั่นจะทำให้หน้าตาคล้ายกันและบางครั้งก็มีความสอดคล้องกัน 1

โดยทั่วไป (หรือในอดีต) เว็บเซิร์ฟเวอร์มักจะทำลำดับชั้นของไดเรกทอรีมิรเรอร์ (สำหรับบางคน - เช่น Apache - นี่เป็นส่วนประกอบสำคัญ) และยังจัดทำดัชนีไดเรกทอรีเหมือนกับระบบไฟล์ อย่างไรก็ตามไม่มีอะไรเกี่ยวกับโปรโตคอล HTTP ที่ต้องการสิ่งนี้

นี้เป็นสิ่งสำคัญเพราะถ้าคุณต้องการใช้ glob ในการพูด, ทุกอย่างซึ่งเป็น subpath ของhttp://foo/bar/เว้นแต่เซิร์ฟเวอร์มีกลไกบางอย่างที่จะช่วยให้คุณมีเช่น (เช่นดัชนีดังกล่าว) มีอะไรที่จะใช้มัน glob ไป ไม่มีระบบไฟล์ในการค้นหา ยกตัวอย่างเช่นเพียงเพราะคุณรู้ว่ามีหน้าhttp://foo/bar/one.htmlและไม่ได้หมายความว่าคุณจะได้รับรายชื่อของไฟล์และไดเรกทอรีย่อยผ่านhttp://foo/bar/two.html http://foo/bar/มันจะสมบูรณ์ภายในโปรโตคอลเพื่อให้เซิร์ฟเวอร์ส่งคืน 404 สำหรับสิ่งนั้น หรืออาจส่งคืนรายการไฟล์ หรืออาจส่งรูปภาพ jpg ที่ดีให้คุณ เป็นต้น

ดังนั้นจึงไม่มีมาตรฐานที่นี่ที่wgetสามารถใช้ประโยชน์ได้ AFAICT, wget ทำงานเพื่อสะท้อนลำดับชั้นของเส้นทางโดยการเชื่อมโยงอย่างแข็งขันในการตรวจสอบแต่ละหน้า กล่าวอีกนัยหนึ่งถ้าคุณทำซ้ำมิเรอร์http://foo/bar/index.htmlมันดาวน์โหลดindex.htmlแล้วแยกลิงค์ที่เป็น subpath ของที่ 2-Aสวิทช์เป็นเพียงตัวกรองที่ถูกนำไปใช้ในกระบวนการนี้

กล่าวโดยย่อถ้าคุณรู้ว่าไฟล์เหล่านี้ถูกทำดัชนีที่ไหนสักแห่งคุณสามารถเริ่มต้นด้วยการใช้-Aไฟล์นั้นได้ ถ้าไม่เช่นนั้นคุณจะโชคไม่ดี


1. แน่นอน FTP URL ก็เป็น URL เช่นกัน อย่างไรก็ตามในขณะที่ฉันไม่ค่อยรู้เกี่ยวกับโปรโตคอล FTP แต่ฉันเดาว่ามันเป็นเรื่องธรรมดาที่มันอาจจะเป็นรูปแบบที่ทำให้เกิดการหมุนได้อย่างโปร่งใส

2. ซึ่งหมายความว่าอาจจะมี URL ที่ถูกต้องhttp://foo/bar/alt/whatever/stuff/ที่จะไม่รวมอยู่http://foo/bar/index.htmlเพราะมันไม่ได้อยู่ในทางใดทางหนึ่งที่เชื่อมโยงกับสิ่งที่อยู่ในชุดของสิ่งที่เชื่อมโยงกับ ต่างจากระบบไฟล์เว็บเซิร์ฟเวอร์ไม่จำเป็นต้องทำให้เลย์เอาต์ของเนื้อหาโปร่งใสและไม่จำเป็นต้องทำในลักษณะที่ชัดเจนโดยสังหรณ์ใจ


0

โซลูชัน 'รูปแบบ -A' ด้านบนอาจไม่ทำงานกับหน้าเว็บบางหน้า นี่คือการทำงานของฉันด้วย wget สองเท่า:

  1. wget หน้า
  2. grep สำหรับรูปแบบ
  3. wget ไฟล์

ตัวอย่าง: สมมติว่ามันเป็นหน้าพอดแคสต์ข่าวและฉันต้องการไฟล์ MP3 5 ไฟล์จากด้านบนของหน้า:

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

grepที่กำลังมองหาไม่มีการเชื่อมโยงพื้นที่ยกมาสองครั้งที่มีและชื่อไฟล์ของฉัน://pattern


RANDOM อยู่ที่นี่อะไร
royki

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