अपने Makefile में कुछ इस तरह का प्रयास करें:
.PHONY: local.dat
local.dat:
[ -e example.gz ] || touch -d '00:00' example.gz
curl -z example.gz -s http://example.org/example.gz -o example.gz
[ -e $@ ] || touch -d 'yesterday 00:00' $@
if [ "$(shell stat --printf '%Y' example.gz)" \
-gt "$(shell stat --printf '%Y' $@)" ] ; then \
zcat example.gz | transmogrify >$@ ; \
fi
truncate -s 0 example.gz
touch -r $@ example.gz
(ध्यान दें: यह एक मेकफाइल है, इसलिए इंडेंट टैब हैं, स्पेस नहीं। बेशक, यह भी महत्वपूर्ण है कि \कंटीन्यूअस लाइन्स के बाद कोई स्पेस न हो - वैकल्पिक रूप से बैकस्लैश-एस्केप से छुटकारा पाएं और एक लंबे समय तक करें, लगभग-अप्राप्य रेखा)
यह जीएनयू makeनुस्खा पहले जांच करता है कि एक फ़ाइल कहा जाता है example.gzमौजूद है (क्योंकि हम साथ इसे का उपयोग करने जा रहे हैं -zमें curl), और साथ यह बनाता है touch, तो ऐसा नहीं है। स्पर्श इसे 00:00 (वर्तमान दिन के 12 बजे) के टाइमस्टैम्प के साथ बनाता है।
तो फिर यह का उपयोग करता curlहै -z( --time-cond) केवल डाउनलोड करने का विकल्प example.gzहै, तो यह पिछली बार इसे डाउनलोड किया गया था के बाद से संशोधित किया गया है। -zएक वास्तविक दिनांक अभिव्यक्ति, या फ़ाइल नाम दिया जा सकता है। यदि फ़ाइल नाम दिया गया है, तो यह समय की स्थिति के रूप में फ़ाइल के संशोधन समय का उपयोग करेगा।
उसके बाद, यदि local.datवह मौजूद नहीं है, तो यह उस समय से पुरानेtouch होने की गारंटी वाले टाइमस्टैम्प का उपयोग करके बनाता है । यह आवश्यक है क्योंकि अगले आदेश के लिए इसका माइम टाइमस्टैम्प प्राप्त करने के लिए मौजूद होना आवश्यक है ।example.gzlocal.datstat
फिर, अगर example.gzटाइमस्टैम्प नया की तुलना में है local.dat, तो यह पाइप example.gzमें जाता है transmogrifyऔर आउटपुट को रीडायरेक्ट करता है local.dat।
अंत में, यह बहीखाता और सफाई सामान देता है:
- यह छोटा हो जाता है
example.gz(क्योंकि आपको केवल एक टाइमस्टैम्प रखने की आवश्यकता है, और पूरी फ़ाइल नहीं)
touchतों example.gzइतना है कि यह उसी टाइमस्टैम्प के रूप में हैlocal.dat
.PHONY लक्ष्य सुनिश्चित करता है कि local.datलक्ष्य को हमेशा निष्पादित किया जाता है, भले ही उस नाम की फ़ाइल पहले से मौजूद हो।
@Toby Speight को टिप्पणियों में इंगित करने के लिए धन्यवाद कि मेरा मूल संस्करण काम नहीं करेगा, और क्यों।
वैकल्पिक रूप से, यदि आप transmogrifyफ़ाइल को पहले फाइल सिस्टम में डाउनलोड किए बिना सीधे इसमें पाइप करना चाहते हैं :
.PHONY: local.dat
local.dat:
[ -e example.gz ] || touch -d '00:00' example.gz
[ -e $@ ] || touch -d 'yesterday 00:00' $@
if [ "$(shell stat --printf '%Y' example.gz)" \
-gt "$(shell stat --printf '%Y' $@)" ] ; then \
curl -z example.gz -s http://example.org/example.gz | transmogrify >$@ ; \
fi
touch -r $@ example.gz
नोट: यह ज्यादातर अप्रयुक्त है इसलिए वाक्यविन्यास को बिल्कुल सही पाने के लिए कुछ छोटे बदलावों की आवश्यकता हो सकती है। यहां महत्वपूर्ण बात यह है कि विधि, कॉपी-पेस्ट कार्गो-पंथ समाधान नहीं है।
मैं दशकों से इस पद्धति (यानी touchटाइमस्टैम्प फ़ाइल) के रूपांतरों का उपयोग कर रहा हूं make। यह काम करता है, और आमतौर पर मुझे अपने स्वयं के निर्भरता रिज़ॉल्यूशन कोड को श में लिखने से बचने की अनुमति देता है (हालांकि मुझे stat --printf %Yयहां कुछ ऐसा ही करना पड़ा है)।
हर कोई जानता makeहै कि सॉफ्टवेयर को संकलित करने के लिए एक महान उपकरण है ... IMO यह सिस्टम व्यवस्थापक और स्क्रिप्टिंग कार्यों के लिए बहुत कम रेटेड उपकरण है।
-zझंडा, ज़ाहिर है, यह मानता है कि दूरस्थ सर्वर का उपयोग करता हैIf-Modified-Sinceहेडर। जरूरी नहीं कि ऐसा ही हो। सर्वर सेटअप के आधार पर, आपको इसके बजाय हेडर कीETagजाँच करकेCache-Control, या एक अलग चेकसम फ़ाइल (जैसे कि सर्वर प्रदान करता हैsha1sum) की जाँच करके कुछ करने की आवश्यकता हो सकती है ।