ลองสิ่งนี้ใน 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
(หมายเหตุ: นี่คือ Makefile ดังนั้นการเยื้องเป็นแท็บไม่ใช่การเว้นวรรคแน่นอนมันเป็นสิ่งสำคัญเช่นกันที่ไม่มีช่องว่างหลังจาก\บนบรรทัดการต่อเนื่อง - หรือกำจัด backslash-escapes และทำให้ยาวหนึ่งครั้ง เกือบจะไม่สามารถอ่านบรรทัด)
นี้ GNU makeสูตรตรวจสอบก่อนว่าไฟล์ที่เรียกว่าexample.gzมีอยู่ (เพราะเรากำลังจะใช้มันกับ-zในcurl) และสร้างมันด้วยtouchถ้ามันไม่ได้ การสัมผัสสร้างด้วยเวลาประทับ 00:00 น. (12.00 น. ของวันปัจจุบัน)
จากนั้นก็จะใช้curl's -z( --time-cond) ตัวเลือกในการดาวน์โหลดเฉพาะexample.gzถ้ามันได้รับการแก้ไขตั้งแต่ครั้งสุดท้ายที่ถูกดาวน์โหลด -zสามารถได้รับการแสดงออกวันที่จริงหรือชื่อไฟล์ หากได้รับชื่อไฟล์มันจะใช้เวลาแก้ไขของไฟล์เป็นเงื่อนไขเวลา
หลังจากนั้นหากlocal.datไม่ได้อยู่มันจะสร้างมันด้วยtouchการใช้การประทับเวลารับประกันว่าจะเก่าexample.gzกว่า สิ่งนี้จำเป็นเนื่องจากlocal.datจะต้องมีอยู่สำหรับคำสั่งถัดไปเพื่อใช้statในการรับการประทับเวลา mtime
จากนั้นหากexample.gzมีการประทับเวลาใหม่กว่าlocal.datมันท่อexample.gzเข้าและการเปลี่ยนเส้นทางออกไปtransmogrifylocal.dat
ในที่สุดก็ทำสิ่งที่การทำบัญชีและการทำความสะอาด:
- มันตัดทอน
example.gz(เพราะคุณจะต้องเก็บบันทึกเวลาและไม่ใช่ไฟล์ทั้งหมด)
touches 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มานานหลายทศวรรษ มันใช้งานได้และมักจะอนุญาตให้ฉันหลีกเลี่ยงการเขียนรหัสการแก้ปัญหาการพึ่งพาของตัวเองใน sh (แม้ว่าฉันจะต้องทำสิ่งที่คล้ายกับstat --printf %Yที่นี่)
ทุกคนรู้ว่าmakeเป็นเครื่องมือที่ยอดเยี่ยมในการรวบรวมซอฟต์แวร์ ... IMO ยังเป็นเครื่องมือที่ยอดเยี่ยมสำหรับผู้ดูแลระบบและงานเขียนสคริปต์
-zตั้งค่าสถานะสมมติว่าเซิร์ฟเวอร์ระยะไกลใช้If-Modified-Sinceส่วนหัว กรณีนี้อาจไม่จำเป็น ขึ้นอยู่กับการตั้งค่าเซิร์ฟเวอร์คุณอาจต้องทำบางสิ่งด้วยETagหรือโดยการตรวจสอบCache-Controlส่วนหัวหรือโดยการตรวจสอบไฟล์เช็คซัมแยกต่างหาก (เช่นหากเซิร์ฟเวอร์จัดเตรียมsha1sum)