มีวิธีบรรทัดคำสั่งที่ฉันสามารถตรวจสอบว่าไฟล์ที่ดาวน์โหลดมานั้นสมบูรณ์หรือไม่?


13

ฉันกำลังเขียนสคริปต์ที่เกี่ยวข้องกับการดาวน์โหลดและการจัดการไฟล์และฉันต้องการให้แน่ใจว่าไฟล์ไม่สมบูรณ์ (เนื่องจากการเชื่อมต่อที่ลดลง) ก่อนที่ฉันจะทำงานกับมัน

คำตอบ:


10

วิธีที่พบมากที่สุดในการตรวจสอบความสมบูรณ์ของไฟล์ที่ดาวน์โหลดคือการใช้การตรวจสอบ 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ของ


2
รหัสทางออก: gnu.org/software/wget/manual/html_node/…
mikeserv

7

รหัสส่งคืนของคำสั่งที่ใช้ในการดาวน์โหลดไฟล์จะบอกคุณว่าคำสั่งดำเนินการสำเร็จหรือไม่ โดยทั่วไปแล้วโค้ดส่งคืนที่เป็น 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ข้อผิดพลาดยากขึ้น


4
คุณอาจทำแทน:wget -q ... || { handle ; error ; }
mikeserv

@mikeserv ไม่รู้ด้วยซ้ำว่าอยู่ที่นั่นสัมผัสดี
Creek

1
พบเพียงในmanขณะที่อ่านเพื่อตอบและทั้งสองสิ่งที่ฉันจะพูดได้อยู่ที่นี่ในสองคำตอบ - ดังนั้นฉันจึงแสดงความคิดเห็นสอง สัมผัสที่ดีกับคุณเช่นกัน
mikeserv

ฉันคาดว่าสิ่งนี้จะไม่ทำงานเมื่อใช้กับพร็อกซี SOCKS เช่น tor
CodesInChaos

1
@ กรีกสิ่งที่ฉันหมายถึงคือwgetอาจคิดว่าการดาวน์โหลดเสร็จสมบูรณ์แม้ว่ามันจะพัง ข้อมูลพร็อกซีเกี่ยวกับการเชื่อมต่อ TCP ที่เสียหายเมื่อเทียบกับการเชื่อมต่อ TCP ที่ปิดซึ่งเป็นปัญหากับ HTTP เนื่องจากใช้ TCP ปิดเป็นเครื่องหมายสิ้นสุดตามค่าเริ่มต้น นั่นเป็นเหตุผลที่ฉันเพิ่มการตรวจสอบว่าขนาดไฟล์จากส่วนหัวตรงกับขนาดไฟล์ที่ดาวน์โหลดเมื่อฉันเรียกใช้การดาวน์โหลดจำนวนมาก ไม่แน่ใจว่าwgetจะตรวจสอบความสอดคล้องดังกล่าวหรือสิ่งที่ข้อมูลจำเพาะ http ระบุไว้ในปัญหานี้
CodesInChaos
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.