क्या कोई कमांड लाइन विधि है जिसके द्वारा मैं जांच सकता हूं कि डाउनलोड की गई फ़ाइल पूरी है या टूटी हुई है?


13

मैं एक स्क्रिप्ट लिख रहा हूं जिसमें किसी फ़ाइल को डाउनलोड करना और उसमें हेरफेर करना शामिल है, और मैं यह सुनिश्चित करना चाहता हूं कि उस पर काम करने से पहले फ़ाइल अधूरी न हो (जैसे एक गिरा हुआ कनेक्शन)।

जवाबों:


10

डाउनलोड की गई फ़ाइलों की अखंडता को सत्यापित करने का सबसे आम तरीका एमडी 5 चेकसम का उपयोग करना है। यह मानता है कि आप जिस साइट से डाउनलोड कर रहे हैं, वह वास्तव में उनकी फाइलों के एमडी 5 चेकसम हैं। आप डाउनलोड की गई फ़ाइल का अपना चेकसम बनाकर और प्रकाशित चेकसम से तुलना करके MD5 चेकसम को सत्यापित कर सकते हैं। यदि वे समान हैं तो आपके द्वारा डाउनलोड की गई फ़ाइल पूर्ण है और छेड़छाड़ नहीं की गई है।

यदि आप उस फ़ाइल की अपेक्षा नहीं करते हैं जिसे आप बदलने के लिए डाउनलोड कर रहे हैं, तो आप एक चेकसम और हार्ड कोड को स्क्रिप्ट में प्रीकम्प्यूट कर सकते हैं, लेकिन यदि फ़ाइल को कभी अपडेट किया जाता है तो सत्यापन विफल हो जाएगा।

फ़ाइल चलाने के लिए MD5 चेकसम बनाना md5sum myFile। Wget के मामले में आपको यह कमांड उपयोगी लग सकता है, खासकर यदि आप जो फ़ाइल डाउनलोड कर रहे हैं वह बड़ी है:

wget -O - http://example.com/myFile | tee myFile | md5sum > MD5SUM

यह डाउनलोड करते समय "myFile" का एक चेकसम बना देगा और इसे MD5SUM फ़ाइल में सहेज देगा, संभवतः आपको कुछ समय बचा सकता है।

एक गिरा कनेक्शन के मामले में मुझे लगता है कि सबसे अच्छा तरीका होगा कि आप बाहर निकलने के कोड की जांच करें। यदि डाउनलोड बिना किसी त्रुटि के सफल होता है, तो 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/nullWget के सभी आउटपुट को रीडायरेक्ट करता है /dev/nullइसलिए यह BUT स्क्रिप्टिंग के लिए आदर्श है, यह डीबगिंग wgetत्रुटियों को और अधिक कठिन बना देता है।


4
आप इसके बजाय कर सकते हैं:wget -q ... || { handle ; error ; }
mikeserv

@mikeserv पता भी नहीं था कि वहाँ था, अच्छा स्पर्श
क्रीक

1
केवल manउत्तर देने के लिए पढ़ने के दौरान और दो बातें जो मैं कहने जा रहा था, उसमें पहले से ही दो उत्तरों में यहाँ थीं - इसलिए मैंने दो टिप्पणियाँ कीं। आपको भी अच्छा लगा।
मोकेसर

मुझे उम्मीद है कि जब टो जैसे SOCKS परदे के पीछे इस्तेमाल किया जाएगा तो यह काम नहीं करेगा।
कोडइनचोस

1
@ मैं क्या मतलब है कि wgetलगता है कि डाउनलोड पूरा हो गया था, भले ही यह टूट गया। टूटे टीसीपी कनेक्शन बनाम बंद टीसीपी कनेक्शन के बारे में जानकारी जो HTTP के साथ समस्याग्रस्त है क्योंकि यह डिफ़ॉल्ट रूप से बंद मार्क के रूप में टीसीपी का उपयोग करता है। इसीलिए मैंने एक जाँच जोड़ी कि अगर हेडर से फ़ाइल का आकार, डाउनलोड किए गए फ़ाइल के आकार से मेल खाता है जब मैंने एक डाउनलोड किया था। सुनिश्चित नहीं है कि wgetक्या इस तरह की संगति जाँच या http युक्ति इस मुद्दे पर क्या कहती है।
संहिताइंचोस
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.