আপনার মেকফিলটিতে এরকম কিছু চেষ্টা করুন:
.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
(দ্রষ্টব্য: এটি একটি মেকফাইল, সুতরাং ইনডেন্টগুলি ট্যাবগুলি রয়েছে, ফাঁকা স্থান নয় course অবশ্যই এটিও গুরুত্বপূর্ণ যে \ধারাবাহিকতা লাইনের পরে কোনও ফাঁকা স্থান নেই - বিকল্পভাবে ব্যাকস্ল্যাশ-পলায়নগুলি থেকে মুক্তি পান এবং এটি দীর্ঘতর করুন, প্রায়-অপঠনযোগ্য লাইন)
এই গনুহ 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
.FONY লক্ষ্য নিশ্চিত করে যে লক্ষ্যটি local.datসর্বদা কার্যকর করা হয়, এমনকি যদি সেই নামের ফাইলটি ইতিমধ্যে বিদ্যমান থাকে।
আমার মূল সংস্করণটি কার্যকর হবে না এবং কেন তা করা মন্তব্যে নির্দেশ করার জন্য @ টবি স্পিডকে ধন্যবাদ জানাই।
বিকল্পভাবে, আপনি যদি 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
দ্রষ্টব্য: এটি বেশিরভাগই অন্টিস্টেড হয় তাই সিন্টেক্সটি ঠিক সঠিকভাবে পেতে কিছুটা ছোটখাটো পরিবর্তন প্রয়োজন হতে পারে। এখানে গুরুত্বপূর্ণ বিষয়টি হল পদ্ধতি, কোনও অনুলিপি-পেস্ট কার্গো-কাল্ট সমাধান নয় solution
আমি কয়েক দশক ধরে এই পদ্ধতির (অর্থাত্ touchএকটি টাইমস্ট্যাম্প ফাইলটি) ব্যবহার করে আসছি make। এটি কার্যকরভাবে কাজ করে এবং সাধারণত আমার নিজের উপর নির্ভরশীলতা রেজোলিউশন কোডটি sh এ লিখতে না দেওয়া (যদিও আমাকে এ জাতীয় কিছু করতে হবে stat --printf %Y)।
সকলেই জানেন makeসফ্টওয়্যার সংকলনের একটি দুর্দান্ত সরঞ্জাম ... আইএমও এটি সিস্টেম অ্যাডমিন এবং স্ক্রিপ্টিং কার্যগুলির জন্য খুব কম আন্ডার রেটেড সরঞ্জাম।
-zপতাকা, অবশ্যই, ধরে নেয় যে দূরবর্তী সার্ভারে ব্যবহারIf-Modified-Sinceহেডার। এটি অগত্যা ক্ষেত্রে নাও হতে পারে। সার্ভার সেটআপের উপর নির্ভর করে আপনার পরিবর্তে হেডারের সাহায্যে কিছুETagপরীক্ষা করার প্রয়োজন হতে পারেCache-Controlবা আলাদা চেকসাম ফাইলটি পরীক্ষা করে (যেমন সার্ভার একটি সরবরাহ করে তবেsha1sum)।