अपने 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.gz
local.dat
stat
फिर, अगर 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
) की जाँच करके कुछ करने की आवश्यकता हो सकती है ।