अंतिम अद्यतन के बाद से बदला गया है, तो केवल http के माध्यम से फ़ाइल डाउनलोड करें


20

मुझे एक HTTP सर्वर से एक फ़ाइल डाउनलोड करने की आवश्यकता है, लेकिन केवल अगर यह पिछली बार के बाद से मैंने इसे डाउनलोड किया है (जैसे If-Modified-Sinceहेडर के माध्यम से )। मुझे अपनी डिस्क पर फ़ाइल के लिए एक कस्टम नाम का उपयोग करने की भी आवश्यकता है।

मैं लिनक्स पर इस कार्य के लिए किस उपकरण का उपयोग कर सकता हूं?


wget -Nउपयोग नहीं किया जा सकता क्योंकि -Nइसका उपयोग नहीं किया जा सकता है -O


फ़ाइल को डाउनलोड क्यों नहीं किया और फिर उसका नाम बदला?
जूलियन नाइट

.. क्योंकि उपकरण अभी भी जाँच करने में सक्षम होने की आवश्यकता है कि क्या एचटीटीपी संसाधन अंतिम डाउनलोड के बाद बदल गया है? यदि फ़ाइल का नाम बदल दिया गया है तो यह कठिन होगा और इस तरह से उपकरण मौजूद होने की उम्मीद नहीं करता है।
cweiske

क्षमा करें, मैंने उस टिप्पणी को लिया, मेरा उत्तर देखें।
जूलियन नाइट

जवाबों:


26

curlइसके बजाय का उपयोग करने पर विचार करें wget:

curl -o "$file" -z "$file" "$uri"

man curl कहते हैं:

-z/ --time-cond <दिनांक अभिव्यक्ति>

(HTTP / FTP) एक ऐसी फ़ाइल का अनुरोध करें, जिसे दिए गए समय और दिनांक से बाद में संशोधित किया गया है, या उस समय से पहले संशोधित किया गया है। दिनांक की अभिव्यक्ति सभी प्रकार के तार तार हो सकते हैं या यदि यह किसी भी आंतरिक लोगों से मेल नहीं खाता है, तो इसके बजाय दिए गए फ़ाइल नाम से समय प्राप्त करने की कोशिश करता है।

यदि $fileआवश्यक रूप से पहले से मौजूद नहीं है, तो आपको उपयोग करते हुए -zध्वज सशर्त का उपयोग करने की आवश्यकता होगी test -e "$file":

if test -e "$file"
then zflag="-z '$file'"
else zflag=
fi
curl -o "$file" $zflag "$uri"

(ध्यान दें कि हम $zflagयहां के विस्तार को उद्धृत नहीं करते हैं, क्योंकि हम चाहते हैं कि यह 0 या 2 टोकन से विभाजित हो जाए)।

यदि आपका शेल सरणियों (जैसे बाश) का समर्थन करता है, तो हमारे पास एक सुरक्षित और क्लीनर संस्करण है:

if test -e "$file"
then zflag=(-z "$file")
else zflag=()
fi
curl -o "$file" "${zflag[@]}" "$uri"

7

Wget स्विच को -Nकेवल तभी फ़ाइल मिलती है यदि यह बदल गया है इसलिए संभव -Nस्विच सरल स्विच का उपयोग करना होगा जो फ़ाइल को प्राप्त करेगा यदि इसे ज़रूरत है लेकिन इसे गलत नाम के साथ छोड़ देता है। फिर ln -Pकमांड का उपयोग करके एक हार्ड लिंक बनाएं ताकि इसे सही नाम के साथ "फ़ाइल" से जोड़ा जा सके। लिंक की गई फ़ाइल में मूल के समान मेटाडेटा है।

एकमात्र सीमा यह है कि आपके पास फ़ाइल सिस्टम सीमाओं में हार्ड लिंक नहीं हो सकते हैं।


कई उद्देश्यों के लिए, एक प्रतीकात्मक लिंक पर्याप्त हो सकता है - जब तक कि इनकोड पहचान वास्तव में पूछने वाले के लिए मायने नहीं रखती है।
टोबे स्पाइट

1
wget इस काम का बेहतर साधन है। यह टाइमस्टैम्प और फ़ाइल आकार की जाँच करता है, जो कर्ल (7.38.0) नहीं करता है। इसके अलावा, 4xx / 5xx पर गैर-0 के साथ wget समाप्त हो जाता है, जबकि कर्ल डिफ़ॉल्ट रूप से सर्वर-कोड के बारे में वास्तव में परवाह नहीं करता है।
स्काइफेरस्टापेल

4

कर्लिंग कमांड लपेटने के लिए पायथन 3.5+ स्क्रिप्ट:

import argparse
import pathlib

from subprocess import run
from itertools import chain

parser = argparse.ArgumentParser()
parser.add_argument('url')
parser.add_argument('filename', type=pathlib.Path)
args = parser.parse_args()

run(chain(
    ('curl', '-s', args.url),
    ('-o', str(args.filename)),
    ('-z', str(args.filename)) if args.filename.exists() else (),
))

यह कमाल का है! टीआईएल chain:)
जॉन ऑक्सले

1

" डेट चेक " ("कर्ल-टाइम-कॉन्ड") के समान दृष्टिकोण , फ़ाइल आकार की तुलना के अनुसार डाउनलोड करना होगा, अर्थात केवल तभी डाउनलोड करें जब स्थानीय फ़ाइल में रिमोट फ़ाइल की तुलना में एक अलग आकार हो

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

local_file_size=$([[ -f ${FILE_NAME} ]] && wc -c < ${FILE_NAME} || echo "0")
remote_file_size=$(curl -sI ${FILE_URL} | awk '/Content-Length/ { print $2 }' | tr -d '\r' )

if [[ "$local_file_size" -ne "$remote_file_size" ]]; then
    curl -o ${FILE_NAME} ${FILE_URL}
fi

"कर्ल-जेड / - टाइम-कॉन्ड" विकल्प (जो दूसरे उत्तर में सुझाया गया था) इस मामले में दूरस्थ फ़ाइल डाउनलोड नहीं करेगा (क्योंकि स्थानीय फ़ाइल में एक नई तारीख है), लेकिन यह " आकार जांच " स्क्रिप्ट होगा!

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