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 make
tarifi adlı bir dosya ilk kontroller example.gz
(biz bunu kullanarak olacak çünkü mevcut -z
içinde curl
) ve onu yaratan touch
o 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
. -z
gerç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.dat
yoksa, ondan daha eski olduğu touch
garanti edilen bir zaman damgası kullanarak oluşturur . Bu gereklidir, çünkü bir sonraki komutun mtime zaman damgasını almak için kullanılması gerekir.example.gz
local.dat
stat
Daha sonra, eğer example.gz
daha damgası yeni olan local.dat
bu boru, example.gz
içine transmogrify
ve çı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)
touch
es example.gz
ile 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ı transmogrify
dosya 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 touch
bir 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 %Y
burada benzer bir şey yapmak zorunda kalsam da ).
Herkes bilir make
yazı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.
-z
Bayrak, tabii ki, uzak sunucu kullandığını düşünürIf-Modified-Since
başlıklarını. Durum böyle olmayabilir. Sunucu kurulumuna bağlı olarak, bunun yerineETag
,Cache-Control
baş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 .