ฉันจะเปลี่ยนชื่อไฟล์ที่ดาวน์โหลดเพื่อไม่ให้มีสตริงข้อความค้นหาได้อย่างไร


32

ฉันกำลังดาวน์โหลดไซต์ที่มี wget และมีลิงก์จำนวนมากที่แนบข้อความค้นหาไว้ดังนั้นเมื่อฉันทำสิ่งนี้:

wget -nv -c -r -H -A mp3 -nd http://url.to.old.podcasts.com/

ฉันจบด้วยไฟล์จำนวนมากเช่นนี้

1.mp3?foo=bar
2.mp3?blatz=pow
3.mp3?fizz=buzz

สิ่งที่ฉันต้องการท้ายคือ:

1.mp3
2.mp3
3.mp3

ทั้งหมดนี้เกิดขึ้นใน Ubuntu Linux และฉันได้รับ 1.10.2

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

ใครสามารถช่วยฉันแก้ปัญหานี้ได้บ้าง?


โพสต์คำถามของคุณที่ www.stackoverflow.com
Deniz Zoeteman

3
@TutorialPoint ทำไม คำถามกำลังมองหาสิ่งที่อยู่ภายใน wget-to-do-it ดังนั้นจะย้ายกลับมาที่นี่
ต้มตุ๋น Quixote

ดีไม่มีภายในทาง wget-to-do-it
ayrnieu

1
@ayrnieu: ไม่ได้อยู่ในคำสั่งเดียวไม่มี และไม่ใช่ผู้ช่วย แต่คุณสามารถทำได้ด้วยwgetคำสั่งn + 1 เพียงไม่กี่อย่าง(ถ้าไม่น้อยกว่า)
ต้มตุ๋น Quixote

คำตอบ:


24

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

wget --content-disposition

คุณต้องใช้รุ่นใหม่เพื่อใช้คุณสมบัตินี้

ฉันไม่รู้ว่ามันจัดการเซิร์ฟเวอร์ที่อ้างชื่อไฟล์ว่า '/ etc / passwd' ได้ดีแค่ไหน


ฉันไม่มีปัญหากับคำตอบนี้เพราะมันไม่มีข้อสงสัยในบางสถานการณ์ น่าเสียดายที่มันไม่ได้ผลสำหรับฉันเกี่ยวกับหน้าเว็บที่มีบริการcloudfront ซึ่งมีการ?v=blahกำหนดเวอร์ชันเป็นประเภท อาจมีวิธีเฉพาะบางอย่างในการขอเอกสารโดยที่ไม่มีสิ่งเหล่านี้ฉันไม่รู้ แต่ฉันไม่สามารถค้นหาได้ดังนั้นบางสิ่งบางอย่างเช่นคำตอบอื่น ๆ อาจจำเป็นในกรณีเช่นนี้ (ถ้าใครรู้วิธีที่จะดึง - หรือได้รับ CloudFront ไม่ได้ที่จะให้บริการ - The v=สตริง, ฉันชอบที่จะได้ยินเกี่ยวกับมัน.)
Lindes

17

ฉันรู้ว่าหลังจากประมวลผลชุดข้อมูลขนาดใหญ่ที่ฉันควรสั่งwgetให้ละเว้นสตริงแบบสอบถาม ฉันไม่ต้องการทำซ้ำอีกดังนั้นฉันจึงสร้างสคริปต์นี้ขึ้นมาสำหรับฉัน:

# /bin/bash
for i in `find $1 -type f`
do
    mv $i `echo $i | cut -d? -f1`
done

ใส่ไว้ในไฟล์เช่นrmqstrและchmod +x rmqstr ไวยากรณ์:./rmqstr <directory (defaults to .)>

มันจะลบสตริงการสืบค้นออกจากชื่อไฟล์ทั้งหมดซ้ำ


2
ฉันจะเพิ่ม `-name " \? `เพื่อหาส่วนหนึ่งที่จะ จำกัด เฉพาะกับไฟล์ที่จำเป็น :)"
Arkadiusz 'แมลงวัน' Rzadkowolski

4

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

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

  1. เรียกใช้wgetเพื่อรับไฟล์ HTML ฐานที่มีลิงก์ของคุณ
  2. แยกวิเคราะห์สำหรับ URL;
  3. foreach URL ที่ลงท้ายด้วยmp3,
    1. URL กระบวนการเพื่อรับชื่อไฟล์ (เช่นเปลี่ยนhttp://foo/bar/baz.mp3?gargle=blasterเป็นbaz.mp3
    2. (ไม่บังคับ) ตรวจสอบว่าชื่อไฟล์ไม่มีอยู่
    3. วิ่ง wget <URL> -O <filename>

วิธีนี้จะช่วยแก้ปัญหาของคุณได้ แต่ตอนนี้คุณต้องเข้าใจวิธีการหาไฟล์พื้นฐานเพื่อค้นหาmp3URL ของคุณ

คุณมีเว็บไซต์ / ฐาน URL เฉพาะหรือไม่ ขั้นตอนที่ 1 และ 3 จะง่ายขึ้นในการจัดการกับตัวอย่างที่เป็นรูปธรรม


1

ดังนั้นฉันสามารถเห็นชื่อที่ถูกต้องเมื่อมีการดาวน์โหลดเกิดขึ้น

ตกลง. ใช้ wget ตามปกติ ใช้สคริปต์ post-wget ที่ปกติคุณใช้ แต่ประมวลผลผลลัพธ์ของ wget เพื่อให้ง่ายขึ้น:

#! /bin/sh
exec wget --progress=bar:force $* 2>&1 | \
  perl -pe 'BEGIN { $| = 1 } s,(?<=`)([^\x27?]+),\e[36;1m$1\e[0m, if /^Saving/'
cgi-cut # rename files

สิ่งนี้จะยังคงแสดง?foo=barเมื่อคุณดาวน์โหลด แต่จะแสดงชื่อส่วนที่เหลือเป็นสีฟ้าสดใส


วิธีนี้ค่อนข้างจะแก้ไขปัญหาของชื่อไฟล์ที่จะแสดง แต่ OP ยังต้องการชื่อไฟล์สุดท้ายที่จะไม่มีสตริงการสืบค้น
Michael Mior

1

ฉันมีวิธีการคล้ายกันกับ @Gregory Wolf เพราะรหัสของเขาสร้างข้อความแสดงข้อผิดพลาดเช่นนี้เสมอ:

mv: './file' และ './file' เป็นไฟล์เดียวกัน

ดังนั้นฉันตรวจสอบก่อนว่ามีสตริงแบบสอบถามในชื่อไฟล์ก่อนที่จะย้ายไฟล์:

for f in $(find $1 -type f); do
    if [ $f = ${f%%\?*} ]; then continue; fi
    mv "${f}" "${f%%\?*}"
done

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


0

ดูทั้งสองคำสั่งที่ฉันสร้างขึ้นเพื่อโคลนไซต์และหลังจากเสร็จสิ้นการโคลนคุณสามารถดำเนินการคำสั่งที่สอง

คำสั่งที่สองจะตรวจสอบทั้งโคลนค้นหาชื่อรูปแบบไฟล์ " ? " และจะลบสตริงข้อความค้นหาออกจากชื่อไฟล์

# Clone entire site.
    wget --content-disposition --execute robots=off --recursive --no-parent --continue --no-clobber http://example.com

# Remove query string from a static resource.
for i in `find $1 -type f -name "*\?*"`; do mv $i `echo $i | cut -d? -f1`; done

(ดูในGitHub สรุปสาระสำคัญ )


-2

ยิ่งง่ายยิ่งขึ้น: /unix/196253/how-do-you-rename-files-specifically-in-a-list-that-wget-will-use

นี่เป็นการแนะนำวิธีที่ใช้ฟังก์ชั่นการเปลี่ยนชื่อของ wget เป็นหลัก (สามารถเปลี่ยนแปลงเพื่อรวมไดเรกทอรี) สำหรับไฟล์หลาย ๆ ไฟล์ ดูรุ่นที่สองที่เสนอ


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