আপনার মেকফিলটিতে এরকম কিছু চেষ্টা করুন:
.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
)।