วิธีหยุด cURL ไม่ให้เขียนทับไฟล์ที่ดาวน์โหลด


1

ฉันกำลังใช้

$ xargs -n 1 curl -O < gwurls.txt

เพื่อคว้ารายการไฟล์จำนวนมาก น่าเสียดายที่เว็บไซต์ที่ฉันคว้ามานั้นขึ้นอยู่กับเส้นทางที่จะสร้างความ-Oแตกต่างดังนั้นฉันจึงไม่ทราบถึงความแตกต่างระหว่างa/1.pdfและb/1.pdfกับการปิดบังไฟล์

มีวิธีง่ายๆในการนี้หรือไม่?

คำตอบ:


0

สองแนวทาง:

  • ทำumask 222(หรือumask 277ถ้าปัจจุบัน umask ของคุณอยู่ที่ 77; เช่นเพิ่ม 200 ไปยัง umask ของคุณ) สิ่งนี้จะทำให้ไฟล์ทั้งหมดที่คุณสร้างได้รับการปกป้องr--(ไม่ว่าจะเป็นอะไรก็ตาม) แทนที่จะเป็นrw-(อะไรก็ตาม)ดังนั้นเมื่อคุณสร้างไฟล์ขึ้นมาแล้วคุณจะไม่สามารถเขียนทับมันได้โดยไม่ต้องchmodลงมือก่อน ราก). วิธีนี้จะตอบคำถามที่คุณโพสต์ไว้ในชื่อเรื่อง แต่ไม่ได้แก้ปัญหาของคุณ หมายความว่าคุณจะสามารถดาวน์โหลดและเก็บรักษาa/1.pdfและพลาดได้สำเร็จb/1.pdfแทนที่จะทำอย่างอื่น (หากเป็นการปลอบใจคุณจะได้รับข้อความแจ้งข้อผิดพลาดแจ้งเตือนการชน)
  • ดูเหมือนว่าปัญหาจะอยู่ในgwurls.txtไฟล์ของคุณซึ่งจะแสดงรายการทั้งคู่a/1.pdf และb/1.pdfพยายามแก้ไขที่นั่น ผสมกับsedหรือสิ่งที่ดูเหมือน
  a / 1.pdf a_1.pdf
  b / 1.pdf b_1.pdf

…แล้วเขียนสคริปต์ที่ทำงานcurlด้วย URL ของ$1และสเปคเอาท์พุทของ$2และเรียกใช้

  xargs -n 2your_script< modified_gwurls.txt

ดังนั้นxargsจะทำงาน

your_script   a/1.pdf  a_1.pdf
your_script  b/1.pdf  b_1.pdf

สิ่งนี้จะยุ่งถ้ามีชื่อไฟล์ใด ๆ ที่มีช่องว่างในนั้น - แต่ฉันเดาว่ามันเป็นไปไม่ได้สำหรับ URL ใช่ไหม?


ฉันจดจ่อกับการโทรอย่างเต็มที่และหลีกเลี่ยงสิ่งที่เห็นได้ชัด ขอบคุณสำหรับมุมมอง
PHPeer

0

wget

ทางออกที่ง่ายที่สุดจะติดตั้ง Wgetและดำเนินการคำสั่งต่อไปนี้:

wget --input-file=gwurls.txt

Wget เปลี่ยนชื่อไฟล์เอาต์พุตโดยอัตโนมัติหากไฟล์ที่มีชื่อเดียวกันมีอยู่แล้ว

การเปลี่ยนชื่อ

หากคุณตัดชุดรูปแบบและโฮสต์ (เช่นhttp://example.com/) จาก URL คุณสามารถแทนที่เครื่องหมายทับทั้งหมดด้วยเครื่องหมายขีดล่าง (หรืออักขระอื่น ๆ ) และบันทึกไฟล์เช่นนั้น เพื่อความปลอดภัยคุณสามารถแทนที่ขีดล่างที่มีอยู่ก่อนด้วยเครื่องหมายขีดล่างคู่

ด้วย bash สิ่งนี้จะทำงาน:

while read -r URL; do
    OUTPUT="${URL#http://example.com/}"
    OUTPUT="${OUTPUT//_/__}"
    OUTPUT="${OUTPUT//\//_}"

    curl --output "$OUTPUT" --url "$URL"
done < gwurls.txt

มันทำงานอย่างไร:

  • while read -r URL; do ... done < gwurls.txtอ่านเนื้อหาของgwurls.txtละบรรทัดและเก็บสายทั้งหมด (ไม่มีช่องว่างนำหน้าหรือต่อท้าย) ลงในตัวแปรURL...และดำเนินการ

  • สามOUTPUT=...คำสั่งดำเนินการเปลี่ยนดังกล่าวโดยใช้การจัดการสตริงทุบตี

  • curl --output "$OUTPUT" --url "URL" ดาวน์โหลดไฟล์และจัดเก็บด้วยชื่อไฟล์ที่ต้องการ

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

นอกจากนี้ยังเป็นไปได้ที่จะสร้างโครงสร้างไดเรกทอรีของเซิร์ฟเวอร์อีกครั้งโดยใช้วิธีการที่คล้ายกัน

ด้วย bash สิ่งนี้จะทำงาน:

while read -r URL; do
    OUTPUT="${URL#http://example.com/}"

    curl --create-dirs --output "$OUTPUT" --url "$URL"
done < gwurls.txt

นี่--create-dirsสวิทช์ทำให้ม้วนสร้างไดเรกทอรีaถ้าOUTPUTa/1.pdfอ่าน


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