क्या मैं डुप्लिकेट बनाने वाली विग को रोक सकता हूं?


13

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

$ wget https://cdn.sstatic.net/askubuntu/img/logo.png
...
Saving to: ‘logo.png’
...

$ wget https://cdn.sstatic.net/askubuntu/img/logo.png
...
Saving to: ‘logo.png.1’
...

(यदि कर्ल ऐसा नहीं कर सकते तो कर्ल या एक समान स्क्रिप्ट के विकल्प का उपयोग करके खुश हैं।)


9
खैर यह एक नया बनाता है क्योंकि यह पहचानता है कि फ़ाइल वहाँ है!
निको

जवाबों:


17

मेरा सुझाव है कि आप -Nविकल्प का उपयोग करें ।

-N
--timestamping
    Turn on time-stamping.

यह टाइम-स्टैम्पिंग को सक्षम करता है, जो फ़ाइल को केवल तभी डाउनलोड करता है यदि डाउनलोड किए गए संस्करण की तुलना में सर्वर पर इसका नया उपयोग किया जाता है।

$ wget -N https://cdn.sstatic.net/askubuntu/img/logo.png
...
Saving to: ‘logo.png’
...

$ wget -N https://cdn.sstatic.net/askubuntu/img/logo.png
...
Server file no newer than local file ‘logo.png’ -- not retrieving.

चेतावनी (KasiyA की टिप्पणी से)

यदि सर्वर ठीक से कॉन्फ़िगर नहीं किया गया है, तो यह हमेशा रिपोर्ट कर सकता है कि फ़ाइल नई है और -Nहमेशा फ़ाइल को फिर से डाउनलोड करेगी। इस मामले में, -ncशायद एक बेहतर विकल्प है।


3
जब एक सर्वर ठीक से कॉन्फ़िगर नहीं किया जाता है तो -Nविफल हो सकता है और हमेशा ही रीडगेज हो जाएगा। तो कभी-कभी इससे -ncबेहतर होता है-N
αғsнι

1
@ कासी आपकी टिप्पणी के लिए धन्यवाद, सभी मामलों के लिए कोई अच्छा विकल्प नहीं है।
जोफेल

16

हाँ यह -cविकल्प है।

--continue
    Continue getting a partially-downloaded file.  This is useful when you want to
    finish up a download started by a previous instance of Wget, or by another
    program.

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

$ wget -c https://cdn.sstatic.net/askubuntu/img/logo.png
...
Saving to: ‘logo.png’
...

$ wget -c https://cdn.sstatic.net/askubuntu/img/logo.png
...
The file is already fully retrieved; nothing to do.

चेतावनियां (jofel की टिप्पणी से)

यदि फ़ाइल सर्वर पर बदल गई है, तो -cविकल्प गलत परिणाम दे सकता है।

साथ -c, wget बस पहले से ही डाउनलोड की गई फ़ाइल का हिस्सा से परे किसी भी डेटा के लिए सर्वर, और कुछ नहीं कहता है। यह जाँच नहीं करता है कि पहले से डाउनलोड की गई फ़ाइल के हिस्से में कोई बदलाव हुआ या नहीं। इस प्रकार, आप एक दूषित फ़ाइल जो पुरानी और नई फ़ाइल का मिश्रण है।


स्थानीय परीक्षण

आप निम्नलिखित के रूप में सरल स्थानीय वेब-सर्वर चलाकर इसका परीक्षण कर सकते हैं ( @roadmr के उत्तर के लिए धन्यवाद ):

एक टर्मिनल विंडो खोलें और टाइप करें:

cd /path/to/parent-download-dir/
python -m SimpleHTTPServer

अब एक और टर्मिनल खोलें और करें:

wget -c http://localhost:8000/filename-to-download

ध्यान दें कि filename-to-downloadवह फ़ाइल है जिसमें स्थित है /path/to/parent-download-dir/जिसे हम इसे डाउनलोड करना चाहते हैं।

अब यदि आप कई बार wget कमांड चलाते हैं तो आप देखेंगे:

The file is already fully retrieved; nothing to do.

ठीक है, अब /path/to/parent-download-dir/निर्देशिका में जाएं और स्रोत फ़ाइल में कुछ जोड़ें, उदाहरण के लिए यदि यह एक पाठ फ़ाइल है, तो इसमें एक साधारण अतिरिक्त पंक्ति जोड़ें और फ़ाइल को सहेजें। अब के साथ प्रयास करें wget -c ...। बढ़िया, अब आप फ़ाइल को फिर से डाउनलोड करेंगे, लेकिन आपने इसे पहले ही डाउनलोड कर लिया है।

कारण: पुनः डाउनलोड क्यों?

क्योंकि इसका आकार पुरानी डाउनलोड की गई फ़ाइल की तुलना में बड़े आकार में बदल गया और कुछ नहीं।


1
यदि फ़ाइल सर्वर पर डाउनलोड के बीच बदल गई है तो यह सही ढंग से काम नहीं करता है। सबसे खराब स्थिति में (फ़ाइल का आकार बढ़ गया है), आपको एक दूषित फ़ाइल मिलती है।
जोफेल

1
@ जोफेल हाँ -ncजैसा कि आपने कहा लेकिन -cविकल्प काम नहीं करेगा और इसलिए मैंने -cपहले विकल्प का उल्लेख किया है।
α atsнιη

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

विकल्पों की समीक्षा करने के बाद मुझे लगता है कि यह केवल एक लॉग फ़ाइल (वृद्धिशील अपडेट की गारंटी) जैसी किसी चीज के लिए उपयोगी है, अन्य सभी मामलों में मुझे -N या -nc अधिक उपयुक्त हैं क्योंकि वे पूरी फाइलों के साथ सौदा करते हैं
david.libremal

3

इसके अलावा एक और विकल्प है जिसे -ncwgetting कहा जाता है:

--no-clobber
   If a file is downloaded more than once in the same directory, Wget's behavior
   depends on a few options, including -nc.  In certain cases, the local file will
   be clobbered, or overwritten, upon repeated download.  In other cases it will be
   preserved.

जब -ncविकल्प निर्दिष्ट किया जाता है, तो Wget उसी फ़ाइल की प्रतियां डाउनलोड करने से इंकार कर देगा। यदि आपके पास वही फ़ाइल है जो wgetडाउनलोड करने का प्रयास करती है, तो वह इसे डाउनलोड करने से इंकार कर देगी जब तक कि आप स्थानीय फ़ाइल का नाम बदल या हटा नहीं देते।

$ wget -nc https://cdn.sstatic.net/askubuntu/img/logo.png
...
Saving to: ‘logo.png’
...

$ wget -nc https://cdn.sstatic.net/askubuntu/img/logo.png
File ‘logo.png’ already there; not retrieving.

कभी-कभी यह विकल्प दृढ़ता से अच्छा होता है और मैंने -ncविकल्प -cया विकल्प के बजाय विकल्प का उपयोग करने की सिफारिश की है -Nक्योंकि ये विकल्प आपकी स्थानीय फ़ाइल के साथ डाउनलोड-फ़ाइल को अधिलेखित कर देंगे यदि उनके समान नाम थे।

चेतावनी (jofel की टिप्पणी से)

-ncविकल्प अगर यह सर्वर पर बदल गया है फ़ाइल का अद्यतन नहीं करता है। यदि आप जानते हैं कि फ़ाइल बदल जाएगी, तो -Nविकल्प बेहतर होगा। यदि आप जानते हैं कि फ़ाइल नहीं बदलेगी (या आपको परवाह नहीं है) तो -ncठीक है।


1

मुझे पता है कि यह एक विशिष्ट प्रश्न था, लेकिन ओपी ने उल्लेख किया था कि "कर्ल या एक समान स्क्रिप्ट योग्य विकल्प का उपयोग करने में खुशी हो सकती है, यदि विकट ऐसा नहीं कर सकता है।" मुझे यकीन नहीं है कि यहां क्या आवश्यकता है (कई फाइलें, पुराने संस्करण को मूल से अलग रखने पर, नए डाउनलोड किए गए संस्करण से बदल दें)। इस पर निर्भर करता है कि आप क्या चाहते हैं और आप कैसे डुप्लिकेट को संभालना चाहते हैं, आपको इससे अधिक की आवश्यकता हो सकती है .. एक बहुत ही सरल तरीका है जो आप चाहते हैं कि इसके बजाय बस कर्ल का उपयोग करना है।

curl http://cdn.sstatic.net/askubuntu/img/logo.png?v=ca4d192163aa > logo.png

यह कमांड हर बार पुरानी फ़ाइल को नए डाउनलोड के साथ बदल देगा।

यदि आप बाइनरी फ़ाइल को पाठ के विपरीत डाउनलोड कर रहे हैं तो इसे टर्मिनल ("> [फ़ाइल नाम]" के बिना) आउटपुट न करें। ऐसा करने से आपके टर्मिनल सत्र में संभावित गड़बड़ी हो सकती है। यदि आप ऐसा करते हैं तो दुर्घटना होने पर आपको एक और शेल / टर्मिनल सत्र खोलने की आवश्यकता हो सकती है।


यदि आपका टर्मिनल एक खराब स्थिति में है क्योंकि आपने बाइनरी फाइलें प्रदर्शित की हैं, तो नया टर्मिनल खोलने की तुलना में प्रोग्राम को "रीसेट" कहना आसान है।
जोफेल

आप सही हैं कि मैं अपनी आवश्यकताओं पर स्पष्ट नहीं था, सुखद परिणाम यह है कि मैंने कुछ और विकल्पों के बारे में सीखा :) धन्यवाद
david.libremone

धन्यवाद @jofel ^ ^ को "रीसेट" के बारे में नहीं पता था कि मैंने हमेशा बंद किया एक नया टैब खोला और एक बंद हुआ जब यह हुआ ... हालांकि मैं वास्तव में ऐसा नहीं हुआ।
गोबलिनॉर्ड
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.