मैं URL और उनकी संबंधित आउटपुट फ़ाइलों की सूची के साथ wget का उपयोग कैसे करूं?


35

मान लीजिए कि list_of_urlsऐसा दिखता है:

http://www.url1.com/some.txt
http://www.url2.com/video.mp4

मुझे पता है कि इसका उपयोग कैसे करना है:

wget -i list_of_urls

लेकिन, अगर मेरे list_of_urlsपास यह है, और वे सभी पीडीएफ या वीडियो जैसी उचित फाइलें लौटाते हैं:

http://www.url1.com/app?q=123&gibb=erish&gar=ble
http://www.url2.com/app?q=111&wha=tcha&mac=allit

एक एकल फ़ाइल के लिए मैं यह कर सकता था:

wget -O some.txt "http://www.url1.com/app?q=123&gibb=erish&gar=ble"

मैं wgetURL की उस सूची को डाउनलोड करने और लौटे डेटा को उचित स्थानीय फ़ाइल में सहेजने के लिए कैसे उपयोग करूं ?

जवाबों:


33

डिफ़ॉल्ट रूप से, wget उस फ़ाइल को लिखता है जिसका नाम उस URL का अंतिम घटक है जिसे आप पास करते हैं। कई सर्वर http://www.url1.com/app?q=123&gibb=erish&gar=bleएक अलग दिखने वाले URL जैसे एक अच्छे दिखने वाले फ़ाइल नाम के साथ URL को पुनर्निर्देशित करते हैं http://download.url1.com/files/something.pdf। आप विकल्प को पास something.pdfकरने के बजाय रीडायरेक्ट किए गए URL (यानी ) से नाम का उपयोग करना भूल सकते हैं । यह डिफ़ॉल्ट मोड नहीं है, क्योंकि यदि लापरवाही से उपयोग किया जाता है, तो यह वर्तमान निर्देशिका में एक अप्रत्याशित फ़ाइल नाम को अधिलेखित कर सकता है; लेकिन अगर आप सर्वर पर भरोसा करते हैं या किसी अन्य कीमती फाइलों वाली निर्देशिका में काम कर रहे हैं, तो आमतौर पर उपयोग करने के लिए सही चीज है।app?q=123&gibb=erish&gar=ble--trust-server-names--trust-server-names

कुछ सर्वर Content-Dispositionफ़ाइल नाम निर्दिष्ट करने के लिए पुनर्निर्देशन के बजाय हेडर का उपयोग करते हैं। --content-dispositionइस फ़ाइल के नाम का उपयोग करने के लिए विकल्प पास करें।

इस प्रकार:

wget --content-disposition --trust-server-names -i list_of_urls

यदि आपको अभी भी फ़ाइल के अच्छे नाम नहीं मिल रहे हैं, तो आप अपना खुद का विवरण देना चाहते हैं। मान लीजिए कि आपके पास एक फाइल है जिसमें लाइनें हैं जैसे

http://www.url1.com/app?q=123&gibb=erish&gar=ble foo.pdf
http://www.url2.com/app?q=111&wha=tcha&mac=allit bar.txt

निर्दिष्ट फ़ाइल नामों के लिए फ़ाइलें डाउनलोड करने के लिए, यह मानते हुए कि URL में या फ़ाइल नामों में कोई व्हाट्सएप वर्ण नहीं हैं:

err=0
while read -r url filename tail; do
  wget -O "$filename" "$url" || err=1
done <list_of_urls_and_file_names

errअगर सभी डाउनलोड सफल रहा और 1 अन्यथा, आप कर सकते हैं चर 0 होता है return $errअगर आप इस टुकड़ा एक समारोह में डाल या exit $errयदि आप एक स्ट्रिंग में इस स्निपेट डाल दिया।

यदि आप URL के अलावा कुछ भी निर्दिष्ट नहीं करना चाहते हैं, और आपको सर्वर से अच्छे नाम नहीं मिल सकते हैं, तो आप फ़ाइल प्रकार का अनुमान लगा सकते हैं और कम से कम सार्थक एक्सटेंशन प्राप्त करने का प्रयास कर सकते हैं।

err=0
n=1
while read -r url; do
  if wget -O tmpfile "$url"; then
    ext=data
    case $(file -i tmpfile) in
      application/pdf) ext=pdf;;
      image/jpeg) ext=jpg;;
      text/html) ext=html;;
      text/*) ext=txt;;
    esac
    mv tmpfile "$n.$ext"
  else
    err=1
  fi
  n=$((n+1))
done

इच्छानुसार अन्य प्रकार जोड़ें। यदि आपके fileआदेश में -mविकल्प नहीं है , तो इसे छोड़ दें, और जांचें कि fileआप जिस फ़ाइल प्रकार में रुचि रखते हैं, उसके लिए आपके सिस्टम पर क्या रिटर्न मिलता है। यदि आपके पास /etc/mime.typesअपने सिस्टम पर फ़ाइल है, तो आप एक्सटेंशन से MIME प्रकारों के संघों को पढ़ सकते हैं। इसके बजाय अपनी सूची की आपूर्ति:

n=1
while read -r url; do
  if wget -O tmpfile "$url"; then
    mime_type=$(file -m tmpfile)
    ext=$(awk "$1 == \"$mime_type\" {print \$2; exit} END {print \"data\"}" /etc/mime.types)
    mv tmpfile "$n.$ext"
  else
    err=1
  fi
  n=$((n+1))
done

2

आप अपनी प्रविष्टियों में लूप कर सकते हैं list_of_urls। कुछ इस तरह:

while read -r url; do
    wget -O foo $url
done < list_of_urls

ध्यान दें कि आपको fooप्रत्येक प्रविष्टि के लिए निर्धारण का अपना तरीका जोड़ना होगा list_of_urls(यह भी, मैं मान रहा हूं कि यह आपकी डिस्क पर एक फ़ाइल है)।


यहाँ उस पर एक भिन्नता है: एक पंक्ति के साथ थोड़ी स्क्रिप्ट बनाएं wget -O $2 $1। List_of_urls फ़ाइल में, प्रत्येक पंक्ति को एक url, व्हॉट्सएप, एक फ़ाइल नाम (जैसे) बनाते हैं, http://url1/blah&blah=whatever some.pdfफिर ऊपर दिए गए उपयोग के साथ ही, wget लाइन को प्रतिस्थापित करते हैं ./thatscript.sh $url। इस मामले $urlमें वास्तव में एक url और फ़ाइल नाम के साथ एक पंक्ति होती है, निश्चित रूप से
गोल्डीलॉक्स

2
भिन्नता 2: url और filenames को अलग-अलग, बारी-बारी से लाइनों की list_of_urls फ़ाइल में डालें, फिर उपयोग करें while read url; do read filename; wget -O $filename $url; done < list_of_urls
गोल्डीलॉक्स

2

आप सीधे wgetविकल्प का उपयोग कर सकते हैं :

wget -r -i list_of_urls

यह काम नहीं करता है: -rपुनरावर्ती डाउनलोड को सक्षम करता है । फ़ाइल नाम सही तरीके से सेट नहीं किए गए हैं।
जोफेल
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.