2011-06-12 12 views
5

मेरे पास एक शेल स्क्रिप्ट है। एक क्रॉन नौकरी दिन में एक बार इसे चलाता है। फिलहाल यह वेब से एक फ़ाइल को wget का उपयोग करके डाउनलोड करता है, फ़ाइल नाम पर टाइमस्टैंप जोड़ता है, फिर उसे संपीड़ित करता है। मूल सामानबैश स्क्रिप्टिंग डी-डुप्ले

यह फ़ाइल बहुत बार नहीं बदलती है, इसलिए यदि डाउनलोड पहले से मौजूद है तो मैं डाउनलोड की गई फ़ाइल को त्यागना चाहता हूं।

ऐसा करने का सबसे आसान तरीका?

धन्यवाद!

उत्तर

5

क्या आपको वास्तव में फ़ाइल को संपीड़ित करने की आवश्यकता है?
wget-N, --timestamping प्रदान करता है जो स्पष्ट रूप से, टाइम-स्टैम्पिंग चालू करता है।

$ wget -N www.example.com/file.txt 
[...] 
[...] file.txt saved [..size..] 

अगली बार इसे इस तरह हो जाएगा:

क्या करता है का कहना है कि अपनी फ़ाइल www.example.com/file.txt

पहली बार जब आप कर पर स्थित है

$ wget -N www.example.com/file.txt Server file no newer than local file “file.txt” -- not retrieving. 

सिवाय इसके कि सर्वर पर फ़ाइल अद्यतन की गई थी।

यदि आप फ़ाइल को संपीड़ित नहीं करते हैं तो यह आपकी समस्या का समाधान करेगा।
यदि आपको वास्तव में इसे संपीड़ित करने की आवश्यकता है, तो मुझे लगता है कि मैं नई फ़ाइल/संग्रह और पुराने के हैश की तुलना करने के साथ जाऊंगा। उस मामले में क्या मायने रखता है, डाउनलोड की गई फ़ाइल कितनी बड़ी है? क्या यह पहले इसे संपीड़ित करने के लायक है और फिर हैश की जांच कर रहा है? क्या पुराने संग्रह को डिकंप्रेस करना और हैश की तुलना करना उचित है? पुराने हैश को एक txt फ़ाइल में स्टोर करना बेहतर है? क्या पुरानी फाइल को ओवरराइट करने पर इन सभी का लाभ है?

आप केवल इतना जानते हैं कि, कुछ परीक्षण करें।


तो अगर आप हैश रास्ता तय, पर विचार SHA256 और XZ (LZMA2 एल्गोरिथ्म) संपीड़न।
मैं कुछ इस तरह (बैश में) करना होगा:

newfilesum="$(wget -q www.example.com/file.txt -O- | tee file.txt | sha256sum)" 
oldfilesum="$(xzcat file.txt.xz | sha256sum)" 
if [[ $newfilesum != $oldfilesum ]]; then 
    xz -f file.txt # overwrite with the new compressed data 
else 
    rm file.txt 
fi 

और यह काम होने पर;

+0

मुझे वास्तव में यह नहीं पता था। जानकारी के लिए धन्यवाद - बहुत उपयोगी। दुर्भाग्यवश सर्वर कोई उपयोगी अंतिम-संशोधित या इटाग हेडर प्रदान नहीं कर रहा है। – aidan

+0

'-N' के साथ 'wget' चलाते समय, फ़ाइल की एक नई प्रति डाउनलोड करने के लिए या नहीं, इस फ़ाइल के _local_ और _remote_ ** timestamp ** और ** आकार ** पर निर्भर करता है। इसलिए यदि आप जानते हैं कि फ़ाइल हर बार बढ़ती है और यह एक ही आकार नहीं हो सकती है, या यदि आपको लगता है कि फ़ाइल को अपडेट होने की संभावना है और एक ही आकार होने के कारण बहुत छोटा है, तो आप अभी भी इसका उपयोग कर सकते हैं। – c00kiemon5ter

+0

@aidan मैंने थोड़ा सा हैश प्रकार समाधान प्रदान करने के लिए अपना जवाब संपादित किया है, यह जांचें कि क्या यह आपको उपयुक्त बनाता है;) – c00kiemon5ter

0

फ़ाइल डाउनलोड करने के बारे में, और "आखिरी सहेजी गई" फ़ाइल के विरुद्ध इसे जांचने के बारे में कैसे?

उदाहरण के लिए, पहली बार यह myfile डाउनलोड करता है, और इसे myfile-[date] के रूप में सहेजता है, और इसे संपीड़ित करता है। यह lastfilemyfile-[date] पर इंगित करने वाला एक प्रतीकात्मक लिंक भी जोड़ता है। अगली बार जब स्क्रिप्ट चलती है, तो यह जांच सकता है कि lastfile अंक की सामग्री नई डाउनलोड की गई फ़ाइल के समान है या नहीं।

पता नहीं है कि यह अच्छी तरह से काम करेगा, लेकिन मैं यही सोच सकता हूं।

+0

मुझे यह विचार पसंद है। मैं उम्मीद कर रहा था कि आखिरी फाइल में पॉइंटर स्टोर किए बिना डी-डुप्ली का कोई तरीका था। लेकिन यह काम करेगा। – aidan

+0

इसे पेंच करें। मैं पर्ल का उपयोग करूंगा। 'perl -e '% x =(); के लिए (<*>) {$ md5 = \ 'md5sum $ _ \'; अगले जब तक $ md5 = ~/([0-9a-f] {32}) /; \ 'आरएम $ _ \' यदि $ x {$ 1} ++} '' – aidan

1

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

इसके अलावा, ध्यान रखें कि वेब पृष्ठों पर अधिक जानकारी देने के लिए विकसित हो रहा है, यानी मेटाडाटा। एक अच्छी तरह से स्थापित वेबसाइट में प्रतिक्रिया शीर्षलेख के हिस्से के रूप में फ़ाइल संस्करण और/या संशोधन की तारीख (या मान्य, समाप्ति शीर्षलेख) शामिल होनी चाहिए। यह, और अन्य चीजें, वेब 2.0 की स्केलेबिलिटी बनाता है।

0

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

संबंधित मुद्दे