ฉันกำลังเขียนสคริปต์ที่เกี่ยวข้องกับการดาวน์โหลดและการจัดการไฟล์และฉันต้องการให้แน่ใจว่าไฟล์ไม่สมบูรณ์ (เนื่องจากการเชื่อมต่อที่ลดลง) ก่อนที่ฉันจะทำงานกับมัน
ฉันกำลังเขียนสคริปต์ที่เกี่ยวข้องกับการดาวน์โหลดและการจัดการไฟล์และฉันต้องการให้แน่ใจว่าไฟล์ไม่สมบูรณ์ (เนื่องจากการเชื่อมต่อที่ลดลง) ก่อนที่ฉันจะทำงานกับมัน
คำตอบ:
วิธีที่พบมากที่สุดในการตรวจสอบความสมบูรณ์ของไฟล์ที่ดาวน์โหลดคือการใช้การตรวจสอบ MD5 นี่ถือว่าเว็บไซต์ที่คุณกำลังดาวน์โหลดจากการตรวจสอบไฟล์ MD5 ที่เผยแพร่จริงของพวกเขา คุณสามารถตรวจสอบการตรวจสอบ MD5 โดยการสร้างการตรวจสอบของคุณเองของไฟล์ที่ดาวน์โหลดและเปรียบเทียบกับการตรวจสอบการเผยแพร่ หากไฟล์เหล่านี้เหมือนกันกับไฟล์ที่คุณดาวน์โหลดเสร็จสมบูรณ์และไม่ถูกแก้ไข
หากคุณไม่คาดหวังว่าไฟล์ที่คุณกำลังดาวน์โหลดเปลี่ยนแปลงคุณสามารถคำนวณค่า checksum และ hard code ล่วงหน้าลงในสคริปต์ได้ แต่หากไฟล์นั้นได้รับการอัพเดตตลอดเวลาการตรวจสอบจะล้มเหลว
เพื่อสร้างการตรวจสอบ MD5 md5sum myFile
ของไฟล์วิ่ง ในกรณีของ wget คุณอาจพบว่าคำสั่งนี้มีประโยชน์โดยเฉพาะอย่างยิ่งหากไฟล์ที่คุณดาวน์โหลดมีขนาดใหญ่:
wget -O - http://example.com/myFile | tee myFile | md5sum > MD5SUM
.
สิ่งนี้จะสร้างการตรวจสอบของ "myFile" ในขณะที่ดาวน์โหลดและบันทึกลงในไฟล์ MD5SUM ซึ่งอาจช่วยให้คุณประหยัดเวลา
ในกรณีของการเชื่อมต่อที่ลดลงฉันคิดว่าวิธีที่ดีที่สุดคือการตรวจสอบรหัสทางออกของ wget ถ้าการดาวน์โหลดจะประสบความสำเร็จไม่มีข้อผิดพลาดใด ๆ wget 0
จะกลับมา มีสิ่งใดที่บ่งบอกถึงสิ่งที่ผิดพลาด ลองดูที่ส่วน "ออกจากสถานะ" man wget
ของ
รหัสส่งคืนของคำสั่งที่ใช้ในการดาวน์โหลดไฟล์จะบอกคุณว่าคำสั่งดำเนินการสำเร็จหรือไม่ โดยทั่วไปแล้วโค้ดส่งคืนที่เป็น 0 หมายถึงความสำเร็จและหมายเลขที่ไม่เป็นศูนย์จะแสดงถึงข้อผิดพลาด คุณสามารถเข้าถึงรหัสส่งคืนผ่าน$?
ตัวแปร
ตัวอย่างพื้นฐานที่ใช้wget
จะไป:
#!/bin/bash
wget foo.tgz &> /dev/null
if [[ "$?" != 0 ]]; then
echo "Error downloading file"
else
echo "Success"
fi
&> /dev/null
เปลี่ยนเส้นทางเอาต์พุต wget ทั้งหมดไป/dev/null
ดังนั้นจึงเหมาะสำหรับการเขียนสคริปต์ แต่จะทำให้การแก้ไขwget
ข้อผิดพลาดยากขึ้น
wget -q ... || { handle ; error ; }
man
ขณะที่อ่านเพื่อตอบและทั้งสองสิ่งที่ฉันจะพูดได้อยู่ที่นี่ในสองคำตอบ - ดังนั้นฉันจึงแสดงความคิดเห็นสอง สัมผัสที่ดีกับคุณเช่นกัน
wget
อาจคิดว่าการดาวน์โหลดเสร็จสมบูรณ์แม้ว่ามันจะพัง ข้อมูลพร็อกซีเกี่ยวกับการเชื่อมต่อ TCP ที่เสียหายเมื่อเทียบกับการเชื่อมต่อ TCP ที่ปิดซึ่งเป็นปัญหากับ HTTP เนื่องจากใช้ TCP ปิดเป็นเครื่องหมายสิ้นสุดตามค่าเริ่มต้น นั่นเป็นเหตุผลที่ฉันเพิ่มการตรวจสอบว่าขนาดไฟล์จากส่วนหัวตรงกับขนาดไฟล์ที่ดาวน์โหลดเมื่อฉันเรียกใช้การดาวน์โหลดจำนวนมาก ไม่แน่ใจว่าwget
จะตรวจสอบความสอดคล้องดังกล่าวหรือสิ่งที่ข้อมูลจำเพาะ http ระบุไว้ในปัญหานี้