Coba sesuatu seperti ini di Makefile Anda:
.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
(catatan: ini adalah Makefile, jadi indentasi adalah tab, bukan spasi. Tentu saja juga penting bahwa tidak ada spasi setelah \pada garis kelanjutan - atau singkirkan dari garis miring terbalik dan buat satu panjang, baris yang hampir tidak dapat dibaca)
makeResep GNU ini pertama-tama memeriksa apakah suatu file yang dipanggil example.gzada (karena kita akan menggunakannya dengan -zin curl), dan membuatnya dengan touchjika tidak. Sentuhan menciptakannya dengan cap waktu 00:00 (12:00 hari ini).
Maka menggunakan curl's -z( --time-cond) pilihan untuk hanya men-download example.gzjika telah dimodifikasi sejak terakhir kali itu didownload. -zdapat diberikan ekspresi tanggal aktual, atau nama file. Jika diberi nama file, itu akan menggunakan waktu modifikasi file sebagai kondisi waktu.
Setelah itu, jika local.dattidak ada, ia membuatnya dengan touchmenggunakan cap waktu yang dijamin lebih tua dari itu example.gz. Ini diperlukan karena local.datharus ada untuk perintah berikutnya yang digunakan statuntuk mendapatkan cap waktu mtime-nya.
Kemudian, jika example.gzmemiliki timestamp yang lebih baru dari local.dat, itu menyalurkan example.gzke transmogrifydan mengarahkan output ke local.dat.
Akhirnya, ia melakukan pembukuan & pembersihan:
- itu memotong
example.gz(karena Anda hanya perlu menyimpan stempel waktu, dan bukan seluruh file)
touches example.gzsehingga memiliki cap waktu yang sama sepertilocal.dat
Target .PHONY memastikan bahwa local.dattarget selalu dijalankan, bahkan jika file dari nama itu sudah ada.
Terima kasih kepada @Toby Speight karena menunjukkan di komentar bahwa versi asli saya tidak akan berfungsi, dan mengapa.
Sebagai alternatif, jika Anda ingin menyalurkan file secara langsung transmogrifytanpa mengunduhnya ke sistem file:
.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
CATATAN: ini sebagian besar belum diuji sehingga mungkin memerlukan beberapa perubahan kecil untuk mendapatkan sintaks yang tepat. Yang penting di sini adalah metode, bukan solusi copy-paste kargo-kultus.
Saya telah menggunakan variasi dari metode ini (yaitu touchfileing timestamp) dengan makeselama beberapa dekade. Ini berfungsi, dan biasanya memungkinkan saya untuk menghindari harus menulis kode resolusi ketergantungan saya sendiri di sh (walaupun saya harus melakukan sesuatu yang mirip dengan di stat --printf %Ysini).
Semua orang tahu makeadalah alat yang hebat untuk mengkompilasi perangkat lunak ... IMO itu juga alat yang sangat rendah untuk admin sistem dan tugas skrip.
-zbendera, tentu saja, mengasumsikan bahwa server remote menggunakanIf-Modified-Sinceheader. Ini mungkin belum tentu demikian. Bergantung pada pengaturan server, Anda mungkin perlu melakukan sesuatu denganETag, atau dengan memeriksaCache-Controlheader, atau dengan memeriksa file checksum yang terpisah (misalnya jika server menyediakan asha1sum).