Makefile'nizde böyle bir şey deneyin:
.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
(not: bu bir Makefile'dir, bu nedenle girintiler boşluklar değil, sekmelerdir.Tabii ki \, devam çizgilerinde boşluk bırakılmaması da önemlidir - alternatif olarak ters eğik çizgilerden kaçın ve bir uzun yapın, neredeyse okunamayan çizgi)
Bu GNU maketarifi adlı bir dosya ilk kontroller example.gz(biz bunu kullanarak olacak çünkü mevcut -ziçinde curl) ve onu yaratan toucho değilse. Dokunma, 00:00 (mevcut günün 12:00) zaman damgası ile oluşturur.
Ardından , yalnızca son indirilişinden beri değiştirilmişse indirmek için curl's -z( --time-cond) seçeneğini kullanır example.gz. -zgerçek tarih ifadesi veya dosya adı verilebilir. Bir dosya adı verilirse, dosyanın değişiklik zamanını saat koşulu olarak kullanır.
Bundan sonra, local.datyoksa, ondan daha eski olduğu touchgaranti edilen bir zaman damgası kullanarak oluşturur . Bu gereklidir, çünkü bir sonraki komutun mtime zaman damgasını almak için kullanılması gerekir.example.gzlocal.datstat
Daha sonra, eğer example.gzdaha damgası yeni olan local.datbu boru, example.gziçine transmogrifyve çıkış yönlendirir local.dat.
Son olarak, defter tutma ve temizleme işlerini yapar:
- kısalır
example.gz(çünkü dosyanın tamamını değil, yalnızca bir zaman damgası tutmanız gerekir)
touches example.gzile aynı zaman damgasına sahip olacak şekildelocal.dat
.PHONY hedefi local.dat, bu adın dosyası zaten mevcut olsa bile , hedefin her zaman yürütülmesini sağlar .
Orijinal versiyonumun işe yaramadığını ve neden olduğunu belirttiği için @Toby Speight'a teşekkürler.
Alternatif olarak, önce dosyayı transmogrifydosya sistemine indirmeden doğrudan aktarmak istiyorsanız :
.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
NOT: bu çoğunlukla test edilmemiştir, bu nedenle sözdiziminin tam olarak doğru olması için bazı küçük değişiklikler gerekebilir. Burada önemli olan, kopyala yapıştır kargo kült çözümü değil yöntemdir.
On yıllardır bu yöntemin varyasyonlarını (yani touchbir zaman damgası dosyası) kullanıyorum make. Çalışıyor ve genellikle kendi bağımlılık çözüm kodumu sh olarak yazmaktan kaçınmama izin veriyor (her ne kadar stat --printf %Yburada benzer bir şey yapmak zorunda kalsam da ).
Herkes bilir makeyazılım derlemek için harika bir araç ... IMO aynı zamanda sistem yöneticisi ve komut dosyası görevleri için çok düşük puanlı bir araçtır.
-zBayrak, tabii ki, uzak sunucu kullandığını düşünürIf-Modified-Sincebaşlıklarını. Durum böyle olmayabilir. Sunucu kurulumuna bağlı olarak, bunun yerineETag,Cache-Controlbaşlıkları kontrol ederek veya başlıkları kontrol ederek veya ayrı bir sağlama toplamı dosyasını kontrol ederek (örn. Sunucu a sağlıyorsasha1sum) bir şey yapmanız gerekebilir .