ลองสิ่งนี้ใน 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
เข้าและการเปลี่ยนเส้นทางออกไปtransmogrify
local.dat
ในที่สุดก็ทำสิ่งที่การทำบัญชีและการทำความสะอาด:
- มันตัดทอน
example.gz
(เพราะคุณจะต้องเก็บบันทึกเวลาและไม่ใช่ไฟล์ทั้งหมด)
touch
es 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
)