มีวิธีการปิดการใช้งาน wget จากการรับไฟล์จากไดเรกทอรีแม่ให้ลึก?


11

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

www.foo.com/bar1/bar2/bar3/index.html

ฉันต้องการรับทุกสิ่ง แต่ไม่ใช่ "สูงกว่า" (ในลำดับชั้นต้นไม้) กว่าbar2(!) ดังนั้นbar2ก็ควรจะลึกซึ้ง bar1แต่ไม่

มีวิธีที่จะทำให้เลือกมากขึ้นหรือไม่

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

ปรับปรุง

หรือแทนที่จะระบุความลึกที่เป็นไปได้บางทีอาจเป็น "ไม่มีผู้ปกครองยกเว้นว่าตรงกับ URL นี้หรือ"

อัปเดต 2

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

ความปรารถนาของฉันคือความสามารถในการขึ้น - แสดงโดยบอกว่ามันได้รับอนุญาตให้ขึ้นไปยังโหนด X หรือ (ซึ่งเทียบเท่า 100%) ที่ได้รับอนุญาตให้ขึ้นไปยังโหนด B (โดยที่ระยะทาง BA = X)

ในทุกกรณีกฎสำหรับการหยุดทำงานยังคงอยู่ตามที่ผู้ใช้กำหนด (ตัวอย่างเช่น - ลดระดับโดย Y เท่านั้น)

จะเก็บมันอย่างไร? จริงๆแล้วมันไม่ใช่คำถามจริง ๆ - wgetโดยค่าเริ่มต้นสร้างโครงสร้างเซิร์ฟเวอร์ใหม่ไม่มีอะไรที่นี่จะกลัวหรือไม่จำเป็นต้องแก้ไขอะไร ดังนั้นใน 2 คำ - ตามปกติ

อัปเดต 3

โครงสร้างไดเรกทอรีด้านล่าง - สมมติว่าในแต่ละไดเรกทอรีมีไฟล์เดียวเท่านั้นใน R - R.html และอื่น ๆ แน่นอนว่าเป็นเรื่องง่ายเพราะคุณสามารถมีได้มากกว่าหนึ่งหน้า

        R 
       / \
      B   G
     / \
    C   F
   / \
  A   D
 /
E 

A (A.html) เป็นจุดเริ่มต้นของฉัน X = 2 (ดังนั้น B เป็นโหนดระดับบนสุดที่ฉันต้องการดึงข้อมูล) ในตัวอย่างนี้หมายถึงการดึงข้อมูลหน้าทั้งหมดยกเว้น R.html และ G.html A.html เรียกว่า "จุดเริ่มต้น" เพราะฉันต้องเริ่มจากมันไม่ใช่จาก B.

อัปเดต 4

ใช้การตั้งชื่อจากอัปเดต 3

wget OPTIONS www.foo.com/B/C/A/A.html

คำถามคือสิ่งที่ตัวเลือกในการรับหน้าทั้งหมดจากไดเรกทอรี B และด้านล่าง (รู้ว่าคุณต้องเริ่มต้นจาก A.html)


คุณต้องการbar2เรียก แต่ไม่ใช่bar1? อยู่ที่ไหนbar2จะไปอาศัยอยู่? จะเกิดอะไรขึ้นถ้า dir สองคนขึ้นไปที่คุณไม่ต้องการให้มีส่วนย่อยที่มีชื่อเหมือนกันเนื้อหาของพวกเขาควรจะรวมกันหรือไม่ มันเกือบจะง่ายกว่ามากที่จะได้รับเว็บไซต์ที่น่ารังเกียจทั้งหมดจากนั้นตัด / ย้ายสิ่งต่างๆ
Kilian Foth

@Kilian Foth คุณหมายถึงอะไรโดย "รับทั้งเว็บไซต์ด่า" กำลังรับมัน โดยทั่วไปมันมากเกินไปก็อาจหมายถึงการดึง TB เมื่อจำเป็นต้องใช้ MB สำหรับส่วนที่เหลือให้ดู update2
greenoldman

ไม่แน่ใจว่าคุณหมายถึงอะไร. สิ่งเดียวที่ฉันคิดได้คือคุณต้องการbar2ไดเรกทอรีและเนื้อหาทั้งหมด หากไม่เป็นเช่นนั้นโปรดชี้แจง
Faheem Mitha

@Faheem Mitha "เนื้อหาของมัน" = "ทรีย่อยทั้งหมด" ใช่นี่เป็นเพียงการตีความที่ฉันเชื่อและนั่นคือสิ่งที่ฉันหมายถึง
greenoldman

คำตอบ:


12

ฉันไม่ได้ลอง แต่ใช้ -I และ -X สามารถให้สิ่งที่คุณต้องการ ความพยายามครั้งแรกของฉันจะเป็นไปตาม

wget -m -I bar1/bar2 -X "*" http://www.foo.com/bar1/bar2/bar3/index.html

คำอธิบายของตัวเลือก:

-m: 
   --mirror
       Turn on options suitable for mirroring.  This option turns on recursion and time-stamping, sets
       infinite recursion depth and keeps FTP directory listings.  It is currently equivalent to -r -N -l
       inf --no-remove-listing.
-I: list
   --include-directories=list
       Specify a comma-separated list of directories you wish to follow when downloading.  Elements of
       list may contain wildcards.
-X: list
   --exclude-directories=list
       Specify a comma-separated list of directories you wish to exclude from download.  Elements of list
       may contain wildcards.

4

คุณต้องเพิ่ม / ลงใน URL มิฉะนั้นคุณจะไม่ได้สิ่งที่ต้องการ

หากคุณต้องการรับเนื้อหาทั้งหมดที่www.myhostname.com/somedirectoryไวยากรณ์ควรอ่านดังนี้:

wget -r -nH http://www.myhostname.com/somedirectory/

ลองโดยไม่มีที่สิ้นสุด / และดูว่าเกิดอะไรขึ้น จากนั้นลองด้วย /


1
มันจะยังคงขึ้นไปสู่ไดเรกทอรีที่สูงขึ้นหากหน้าเว็บที่เชื่อมโยงในนั้นอ้างถึงเช่นนี้
EkriirkE

ขอบคุณมากสำหรับคำใบ้ที่มีต่อท้ายสแลช! มันช่วยให้ฉันแก้ปัญหาไฟล์ที่ไม่เกี่ยวข้องที่ถูกเรียกโดย wget จากไดเรกทอรีใกล้เคียง (พี่น้อง)
AntonK

4

ฉันคิดว่าคำตอบที่ถูกต้องที่นี่คือ--no-parentตัวเลือก:

   -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.

ธงนี้ตรงข้ามกับสิ่งที่ OP ต้องการ
EkriirkE

1

บางทีฉันอาจจะพลาดบางอย่าง แต่ถ้านั่นคือสิ่งที่คุณต้องการ

wget -c -np -r www.foo.com/bar1/bar2

ทำงานได้สำหรับฉัน (ใช้ตัวอย่างของคุณ) แน่นอนว่าด้วยตัวเลือกเหล่านี้คุณจะได้รับโครงสร้างไดเรกทอรีทั้งหมดจากwww.foo.comด้านบน หากคุณต้องการbar2ที่ระดับสูงสุดแล้วทำ

wget -c -np -r -nH --cut-dirs=1 www.foo.com/bar1/bar2

-nHกำจัดwww.foo.comและ--cut-dirs=1กำจัดbar1ดังนั้นคุณจะได้รับbar2และไดเรกทอรีย่อยที่ดาวน์โหลดไปยังไดเรกทอรีปัจจุบัน สำหรับข้อมูลเพิ่มเติมโปรดดูman wgetที่ค่อนข้างอ่านได้และมีตัวอย่าง


คุณละเว้นจุดเริ่มต้นคุณจะต้องติดตามลิงก์ คุณคิดว่าจุดเริ่มต้นอยู่ในเวลาเดียวกันระดับบนสุด (นี่เป็นเรื่องเล็กน้อยnp) แต่ฉันกำลังมองหาวิธีแก้ปัญหาทั่วไปเมื่อระดับบนสุดอยู่เหนือจุดเริ่มต้น
greenoldman

@macias: ขออภัยฉันไม่ได้ติดตามคุณ คุณสามารถอธิบายด้วยตัวอย่างได้หรือไม่?
Faheem Mitha

ฉันเพิ่งเพิ่ม "ภาพหน้าจอ" ของ ASCII ฉันหวังว่านี่จะช่วยได้ ในตัวอย่างนี้ A คือจุดเริ่มต้น
greenoldman

@macias: ดังนั้นคุณไม่ต้องการระบุเส้นทางไปยังB(ตามตัวอย่างของคุณ) แต่Aใช่ไหม? ถ้าเป็นเช่นนั้นทำไม เป็นเพราะคุณต้องการทำให้สคริปต์อัตโนมัติหรือด้วยเหตุผลอื่น ฉันไม่แน่ใจว่าคุณหมายถึงอะไรโดย X = 2 นั่นหมายถึงระดับ 2 หรือไม่? ถ้าคุณกำลังพยายามที่จะดึงข้อมูลไดเรกทอรีต่อไปลงในต้นไม้ผมไม่แน่ใจว่าวิธีการที่คุณเห็นความแตกต่างจากB G
Faheem Mitha

A คือจุดเริ่มต้นเนื่องจากเป็นจุดเริ่มต้น - ดูสิฉันอยู่ฝั่งไคลเอ็นต์ไม่ใช่เซิร์ฟเวอร์ IOW - ฉันไม่ได้เป็นเจ้าของเซิร์ฟเวอร์และฉันไม่ได้สร้างโครงสร้างนี้ ฉันต้องจัดการกับสิ่งที่ฉันเห็น Xคือสัญลักษณ์จากการอัพเดต 2 "ความลึก" ที่คุณสามารถขึ้นไปได้หลายระดับ คุณแยกความแตกต่าง B จาก G เนื่องจาก B เป็น B และ G ไม่ใช่ B และคุณเห็น B เนื่องจากเป็นส่วนหนึ่งของ URL สำหรับ A ฉันได้ทำการถามคำถามใหม่ในอัปเดตที่ 4
greenoldman
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.