การใช้ wget เพื่อเรียกไดเรกทอรีซ้ำด้วยไฟล์ที่กำหนดเอง


573

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

http://mysite.com/configs/.vim/

.vim เก็บหลายไฟล์และไดเรกทอรี ฉันต้องการที่จะทำซ้ำที่ลูกค้าใช้ wget ดูเหมือนจะไม่พบคำสั่งผสมที่ถูกต้องของธง wget ที่จะทำสิ่งนี้ ความคิดใด ๆ

คำตอบ:


988

คุณต้องผ่านตัวเลือก-np/ --no-parentเพื่อwget(นอกเหนือจาก-r/ --recursiveแน่นอน) มิฉะนั้นจะตามลิงค์ในดัชนีไดเรกทอรีในเว็บไซต์ของฉันไปยังไดเรกทอรีหลัก ดังนั้นคำสั่งจะเป็นดังนี้:

wget --recursive --no-parent http://example.com/configs/.vim/

เพื่อหลีกเลี่ยงการดาวน์โหลดindex.htmlไฟล์ที่สร้างขึ้นอัตโนมัติให้ใช้ตัวเลือก-R/ --reject:

wget -r -np -R "index.html*" http://example.com/configs/.vim/

52
เพิ่ม -nH (ตัดชื่อโฮสต์ออก) - cut-dirs = X (ลดไดเรกทอรี X) มันเป็นบิตที่น่ารำคาญที่จะมีการนับไดเรกทอรีสำหรับ X ด้วยตนเอง ..
lkraav

3
ทำไมไม่ใด ๆ ของการทำงานเหล่านี้สำหรับw3.org/History/1991-WWW-NeXT/Implementation ? มันจะดาวน์โหลด robots.txt เท่านั้น
matteo

31
@matteo เนื่องจาก robots.txt อาจไม่อนุญาตให้รวบรวมข้อมูลเว็บไซต์ คุณควรเพิ่ม -e robots = off เพื่อบังคับให้รวบรวมข้อมูล
gaborous

เพิ่ม -X / absolute / path / to / โฟลเดอร์เพื่อแยกไดเรกทอรีเฉพาะ
vishnu narayanan

3
หากคุณไม่ต้องการดาวน์โหลดเนื้อหาทั้งหมดคุณสามารถใช้: -l1 เพียงแค่ดาวน์โหลดไดเรกทอรี (example.com ในกรณีของคุณ) -l2 ดาวน์โหลดไดเรกทอรีและโฟลเดอร์ย่อยระดับ 1 ทั้งหมด ('example.com/something' แต่ไม่ใช่ 'example.com/somthing/foo') และอื่น ๆ หากคุณแทรกตัวเลือก no -l wget จะใช้ -l 5 โดยอัตโนมัติ หากคุณใส่ -l 0 คุณจะต้องดาวน์โหลดทั้งอินเทอร์เน็ตเพราะ wget จะติดตามทุกลิงค์ที่พบ stackoverflow.com/a/19695143/6785908
เพื่อนสุ่ม

123

หากต้องการดาวน์โหลดไดเรกทอรีซ้ำซึ่งจะปฏิเสธไฟล์ index.html * และดาวน์โหลดโดยไม่มีชื่อโฮสต์ไดเรกทอรีหลักและโครงสร้างไดเรกทอรีทั้งหมด:

wget -r -nH --cut-dirs=2 --no-parent --reject="index.html*" http://mysite.com/dir1/dir2/data

ฉันไม่สามารถทำงานนี้ได้: wget -r -nH --cut -dirs = 3 - ไม่มีผู้ปกครอง --reject = "index.html *" w3.org/History/1991-WWW-NeXT/Implementation - -cut-dirs = 2 ไม่ทำงานเหมือนกันมันดาวน์โหลด robots.txt เท่านั้นซึ่งจริงๆแล้วอยู่ในโฟลเดอร์รูท ฉันหายไปไหน
matteo

34
@matteo ลองเพิ่ม: -e robots = off
Paul J

หากต้องการรับไดเรกทอรีทั้งหมดซ้ำภายในไดเรกทอรีให้ใช้ wget -r -nH --reject
Prasanth Ganesan

115

สำหรับคนอื่นที่มีปัญหาคล้ายกัน Wget ติดตามrobots.txtซึ่งอาจไม่อนุญาตให้คุณคว้าไซต์ ไม่ต้องกังวลคุณสามารถปิดได้:

wget -e robots=off http://www.example.com/

http://www.gnu.org/software/wget/manual/html_node/Robot-Exclusion.html


เมื่อคุณไม่สนใจ robots.txt อย่างน้อยคุณควรเร่งคำขอของคุณ พฤติกรรมที่แนะนำในคำตอบนี้ไม่สุภาพอย่างมาก
ไม่มีใคร

@Nobody ดังนั้นคำตอบที่สุภาพคืออะไร
Phani Rithvij

@PhaniRithvij ให้คะแนนคำขอของคุณ wget มีพารามิเตอร์สำหรับมัน โปรดทราบว่าบางคนอาจยังมีปัญหาและการพิจารณาไฟล์ robots แจ้งให้คุณทราบอย่างชัดเจนว่าไม่ได้รับอนุญาตให้ทำสิ่งที่คุณกำลังทำอยู่คุณอาจประสบปัญหาทางกฎหมาย
ไม่มีใคร

37

คุณควรใช้แฟล็ก -m (มิเรอร์) เนื่องจากจะต้องระมัดระวังไม่ให้ยุ่งกับการประทับเวลาและเพื่อชดเชยสิ่งที่ไม่สิ้นสุด

wget -m http://example.com/configs/.vim/

หากคุณเพิ่มจุดที่ผู้อื่นกล่าวถึงในกระทู้นี้มันจะเป็น:

wget -m -e robots=off --no-parent http://example.com/configs/.vim/

34

ต่อไปนี้เป็นคำสั่ง wget แบบสมบูรณ์ที่ทำงานเพื่อให้ฉันดาวน์โหลดไฟล์จากไดเรกทอรีของเซิร์ฟเวอร์ (ละเว้นrobots.txt):

wget -e robots=off --cut-dirs=3 --user-agent=Mozilla/5.0 --reject="index.html*" --no-parent --recursive --relative --level=1 --no-directories http://www.example.com/archive/example/5.3.0/

8

หาก--no-parentไม่ช่วยคุณอาจใช้--includeตัวเลือก

โครงสร้างไดเรกทอรี:

http://<host>/downloads/good
http://<host>/downloads/bad

และคุณต้องการดาวน์โหลดdownloads/goodแต่ไม่ใช่downloads/badไดเรกทอรี:

wget --include downloads/good --mirror --execute robots=off --no-host-directories --cut-dirs=1 --reject="index.html*" --continue http://<host>/downloads/good


5

ในการดึงข้อมูลไดเรกทอรีซ้ำด้วยชื่อผู้ใช้และรหัสผ่านให้ใช้คำสั่งต่อไปนี้:

wget -r --user=(put username here) --password='(put password here)' --no-parent http://example.com/

2

Wget 1.18 อาจทำงานได้ดีขึ้นเช่นฉันถูกกัดด้วยข้อบกพร่องรุ่น 1.12 ที่ ...

wget --recursive (...)

... ดึงเฉพาะ index.html แทนไฟล์ทั้งหมด

วิธีแก้ปัญหาคือสังเกตว่ามีการเปลี่ยนเส้นทาง 301 รายการและลองตำแหน่งใหม่ - ด้วย URL ใหม่ทำให้มีไฟล์ทั้งหมดในไดเรกทอรี


2

ทั้งหมดที่คุณต้องเป็นสองธงหนึ่งคือ"-r"สำหรับการเรียกซ้ำและ"--no-parent"(หรือ-np) เพื่อที่จะไม่ไปใน และ'.' ".."แบบนี้:

wget -r --no-parent http://example.com/configs/.vim/

แค่นั้นแหละ. มันจะดาวน์โหลดลงในแผนผังโลคัลต่อไปนี้: ./example.com/configs/.vim. อย่างไรก็ตามหากคุณไม่ต้องการสองไดเรกทอรีแรกให้ใช้การตั้งค่าสถานะเพิ่มเติม--cut-dirs=2ตามที่แนะนำในคำตอบก่อนหน้านี้:

wget -r --no-parent --cut-dirs=2 http://example.com/configs/.vim/

และมันจะดาวน์โหลดแผนผังไฟล์ของคุณลงในเท่านั้น ./.vim/

ในความเป็นจริงฉันได้รับบรรทัดแรกจากคำตอบนี้อย่างแม่นยำจากคู่มือ wgetพวกเขามีตัวอย่างที่ชัดเจนมากในตอนท้ายของส่วนที่ 4.3


2

ตัวเลือกต่อไปนี้น่าจะเป็นส่วนผสมที่ลงตัวเมื่อจัดการกับการดาวน์โหลดแบบเรียกซ้ำ:

wget -nd -np -P / dest / dir --recursive http: // url / dir1 / dir2

ตัวอย่างที่เกี่ยวข้องจากหน้าคนเพื่อความสะดวก:

   -nd
   --no-directories
       Do not create a hierarchy of directories when retrieving recursively.  With this option turned on, all files will get saved to the current directory, without clobbering (if a name shows up more than once, the
       filenames will get extensions .n).


   -np
   --no-parent
       Do not ever ascend to the parent directory when retrieving recursively.  This is a useful option, since it guarantees that only the files below a certain hierarchy will be downloaded.

1

คุณควรจะทำได้โดยเพิ่ม -r

wget -r http://stackoverflow.com/

9
สิ่งนี้ไม่ได้ดาวน์โหลดไดเรกทอรีจริงๆ แต่ไฟล์ทั้งหมดที่สามารถค้นหาได้บนเซิร์ฟเวอร์รวมถึงไดเรกทอรีด้านบนไดเรกทอรีที่คุณต้องการดาวน์โหลด
Luc

1

รุ่นนี้ดาวน์โหลดซ้ำและไม่สร้างไดเรกทอรีหลัก

wgetod() {
    NSLASH="$(echo "$1" | perl -pe 's|.*://[^/]+(.*?)/?$|\1|' | grep -o / | wc -l)"
    NCUT=$((NSLASH > 0 ? NSLASH-1 : 0))
    wget -r -nH --user-agent=Mozilla/5.0 --cut-dirs=$NCUT --no-parent --reject="index.html*" "$1"
}

การใช้งาน:

  1. เพิ่ม~/.bashrcหรือวางลงในเทอร์มินัล
  2. wgetod "http://example.com/x/"
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.