मैं क्वेरी स्ट्रिंग में शामिल नहीं करने के लिए wget का नाम बदलकर डाउनलोड की गई फ़ाइलों को कैसे बना सकता हूं?


32

मैं एक साइट को wget के साथ डाउनलोड कर रहा हूं और बहुत सारे लिंक में उनसे जुड़े प्रश्न हैं, इसलिए जब मैं ऐसा करता हूं:

wget -nv -c -r -H -A mp3 -nd http://url.to.old.podcasts.com/

मैं इस तरह की बहुत सारी फाइलों को समाप्त करता हूं:

1.mp3?foo=bar
2.mp3?blatz=pow
3.mp3?fizz=buzz

जो मैं समाप्त करना चाहता हूं वह है:

1.mp3
2.mp3
3.mp3

यह सब ubuntu लाइनक्स में हो रहा है और मुझे 1.10.2 wget मिला है।

मुझे पता है कि एक स्क्रिप्ट के माध्यम से सब कुछ प्राप्त करने के बाद मैं यह कर सकता हूं। हालाँकि मुझे वास्तव में wget के भीतर से एक समाधान पसंद है ताकि मैं सही नाम देख सकूँ जैसे कि डाउनलोड हो रहा है।

किसी को भी मेरी मदद कर सकते हैं यह सुलझाना?


अपना प्रश्न www.stackoverflow.com पर पोस्ट करें।
डेनिज़ ज़ोइटमैन

3
@TutorialPoint क्यों? सवाल यह है कि भीतर-ही-रास्ता-करने के लिए खोज रहा है, तो एसओ इसे यहां वापस माइग्रेट करेगा।
क्विकोट क्विकोट

खैर, वहाँ कोई रास्ता नहीं है-के-के-करने के लिए के रूप में
ayrnieu

1
@ayrnieu: नहीं एक आदेश में, नहीं। और सहायक के बिना नहीं। लेकिन आप निश्चित रूप से इसे n + 1 wgetकमांड के साथ कर सकते हैं (यदि कम नहीं)।
क्विक क्वोटोटे

जवाबों:


24

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

wget --content-disposition

इस सुविधा का उपयोग करने के लिए आपको एक नए संस्करण की आवश्यकता होगी।

मुझे नहीं पता कि यह '/ etc / passwd' के फ़ाइल नाम का दावा करने वाले सर्वर को कितनी अच्छी तरह से हैंडल करता है।


मुझे इस जवाब से कोई समस्या नहीं है, क्योंकि इसमें कोई संदेह नहीं है कि कुछ स्थितियों के लिए काम करता है। दुर्भाग्य से, यह मेरे लिए कुछ क्लाउडफ्रंट- योग्य पृष्ठों के संबंध ?v=blahमें उनके प्रकार के संस्करण के साथ काम नहीं किया । इन के बिना दस्तावेज़ का अनुरोध करने के लिए कुछ क्लाउड-विशिष्ट तरीके हो सकते हैं, मुझे नहीं पता, लेकिन मैं एक को खोजने में विफल रहा, इसलिए इस तरह के मामले में अन्य उत्तरों में से एक की तरह कुछ भी आवश्यक हो सकता है। (किसी को भी एक तरह से जानता है की पट्टी - या CloudFront सेवा करने के लिए नहीं मिल - v=तार, मैं इसके बारे में जानने में खुशी होगी।)
lindes

17

मुझे एक बड़े बैच को संसाधित करने के बाद एहसास हुआ कि मुझे wgetक्वेरी स्ट्रिंग्स को अनदेखा करने का निर्देश देना चाहिए । मैं इसे दोबारा नहीं करना चाहता था इसलिए मैंने यह स्क्रिप्ट बनाई जो मेरे लिए काम की:

# /bin/bash
for i in `find $1 -type f`
do
    mv $i `echo $i | cut -d? -f1`
done

जैसे rmqstrऔर chmod +x rmqstr सिंटेक्स की फाइल में रखें :./rmqstr <directory (defaults to .)>

यह सभी फ़ाइलनामों से क्वेरी स्ट्रिंग को पुनरावर्ती रूप से निकाल देगा।


2
मैं केवल आवश्यक फ़ाइलों को सीमित करने के लिए भाग खोजने के लिए `-name" \ "जोड़ूंगा :)
अरकाडियस 'मक्खियां' रज़ादकोवल्स्की

4

मुझे लगता है, wgetURL निर्दिष्ट करने से भिन्न फ़ाइल नाम के रूप में सहेजने के लिए, आपको -O filenameतर्क का उपयोग करने की आवश्यकता है । यह केवल वही करता है जो आप तब चाहते हैं जब आप इसे एक URL देते हैं - कई URL के साथ, सभी डाउनलोड की गई सामग्री समाप्त हो जाती है filename

लेकिन यह वास्तव में जवाब है। एक wgetआदेश में यह सब करने की कोशिश करने के बजाय , कई आदेशों का उपयोग करें। अब आपका वर्कफ़्लो बन गया है:

  1. भागो wgetआधार HTML फ़ाइल (रों) प्राप्त करने के लिए अपने लिंक होता है;
  2. URL के लिए पार्स;
  3. Foreach यूआरएल में समाप्त होने वाले mp3,
    1. यूआरएल की प्रक्रिया एक फ़ाइल नाम पाने के लिए (उदाहरण के लिए बारी http://foo/bar/baz.mp3?gargle=blasterमेंbaz.mp3
    2. (वैकल्पिक) जाँच करें कि फ़ाइल नाम मौजूद नहीं है
    3. रन wget <URL> -O <filename>

यह आपकी समस्या को हल करता है, लेकिन अब आपको यह पता लगाने की आवश्यकता है कि अपने mp3URL को खोजने के लिए आधार फ़ाइलों को कैसे पकड़ा जाए।

क्या आपके मन में कोई विशेष साइट / आधार URL है? चरण 1 और 3 एक ठोस उदाहरण के साथ संभालना आसान होगा।


1

इसलिए मैं सही नाम देख सकता हूं क्योंकि डाउनलोड हो रहा है।

ठीक है। जैसा कि आप सामान्य रूप से करते हैं, वैग का उपयोग करें; आमतौर पर उपयोग की जाने वाली पोस्ट-वगेट स्क्रिप्ट का उपयोग करें, लेकिन वाइज़ के आउटपुट को प्रोसेस करें ताकि यह आंखों पर आसान हो:

#! /bin/sh
exec wget --progress=bar:force $* 2>&1 | \
  perl -pe 'BEGIN { $| = 1 } s,(?<=`)([^\x27?]+),\e[36;1m$1\e[0m, if /^Saving/'
cgi-cut # rename files

यह अभी भी ?foo=barजैसा कि आप डाउनलोड करते हैं, दिखाएगा , लेकिन बाकी नाम उज्ज्वल सियान में प्रदर्शित करेगा।


यह कुछ हद तक फ़ाइल नाम प्रदर्शित होने के मुद्दे को हल करता है, लेकिन ओपी यह भी चाहता है कि अंतिम फ़ाइल का नाम क्वेरी स्ट्रिंग न हो।
माइकल जूनियर

1

मेरे पास @Gregory वुल्फ के समान दृष्टिकोण है क्योंकि उनके कोड ने हमेशा इस तरह त्रुटि संदेश बनाए:

mv: './file' और './ile' एक ही फाइल हैं

इस प्रकार मैं पहली बार जांचता हूं कि फ़ाइल को स्थानांतरित करने से पहले फ़ाइल नाम में कोई क्वेरी स्ट्रिंग है या नहीं:

for f in $(find $1 -type f); do
    if [ $f = ${f%%\?*} ]; then continue; fi
    mv "${f}" "${f%%\?*}"
done

यह प्रत्येक फ़ाइल की पुन: जाँच करेगा और यदि उपलब्ध हो तो उनके फ़ाइलनाम में सभी क्वेरी स्ट्रिंग निकाल देगा।


0

किसी साइट को क्लोन करने के लिए बनाए गए इन दोनों कमांड को देखें, और क्लोन करने के बाद, आप दूसरी कमांड को निष्पादित कर सकते हैं।

दूसरा कमांड पूरे क्लोन में एक नज़र डालेगा, " ? " फ़ाइल पैटर्न नामों की खोज करेगा, और फ़ाइल नाम से क्वेरी स्ट्रिंग हटा देगा।

# Clone entire site.
    wget --content-disposition --execute robots=off --recursive --no-parent --continue --no-clobber http://example.com

# Remove query string from a static resource.
for i in `find $1 -type f -name "*\?*"`; do mv $i `echo $i | cut -d? -f1`; done

(इसे GitHub Gist में देखें ।)


-2

यह और भी आसान है: /unix/196253/how-do-you-rename-files-specifically-in-a-list-that-wget-will-use

यह एक ऐसी विधि का सुझाव देता है जो कई फाइलों के लिए अनिवार्य रूप से wget के नाम बदलने के कार्य (निर्देशिका को शामिल करने के लिए बदल दिया जा सकता है) का उपयोग करता है। प्रस्तावित दूसरा संस्करण देखें।


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