Wypróbuj coś takiego w swoim 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
(uwaga: jest to plik Makefile, więc wcięcia są tabulatorami, a nie spacjami. oczywiście. Ważne jest również to, że po \
liniach kontynuacji nie ma spacji - alternatywnie pozbyć się odwrotnych ukośników i uczynić go jednym długim, prawie nieczytelna linia)
Ten make
przepis GNU najpierw sprawdza, czy plik o nazwie example.gz
istnieje (ponieważ będziemy go używać z -z
in curl
), i tworzy go, touch
jeśli nie ma. Dotyk tworzy go ze znacznikiem czasu 00:00 (12 rano bieżącego dnia).
Następnie używa opcji curl
s -z
( --time-cond
), aby pobrać tylko, example.gz
jeśli został zmodyfikowany od czasu ostatniego pobrania. -z
może otrzymać rzeczywiste wyrażenie daty lub nazwę pliku. Jeśli podano nazwę pliku, wykorzysta czas modyfikacji pliku jako warunek czasowy.
Następnie, jeśli local.dat
nie istnieje, tworzy go za touch
pomocą znacznika czasu, który ma być starszy niż example.gz
. Jest to konieczne, ponieważ local.dat
musi istnieć, aby następne polecenie stat
mogło uzyskać znacznik czasu mtime.
Następnie, jeśli example.gz
jest nowsza niż datownik local.dat
, to rury example.gz
na język transmogrify
i przekierowuje dane wyjściowe local.dat
.
Wreszcie zajmuje się księgowością i porządkami:
- obcina się
example.gz
(ponieważ wystarczy zachować znacznik czasu, a nie cały plik)
touch
es, example.gz
aby miał ten sam znacznik czasu colocal.dat
Cel .PHONY zapewnia, że local.dat
cel jest zawsze wykonywany, nawet jeśli plik o tej nazwie już istnieje.
Dzięki @Toby Speight za wskazanie w komentarzach, że moja oryginalna wersja nie działa i dlaczego.
Alternatywnie, jeśli chcesz bezpośrednio potokować plik transmogrify
bez pobierania go najpierw do systemu plików:
.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
UWAGA: jest to w większości niesprawdzone, więc może wymagać drobnych zmian, aby uzyskać prawidłową składnię. Ważną rzeczą jest tutaj metoda, a nie rozwiązanie kultu ładunku.
Od dziesięcioleci używam odmian tej metody (tj. touch
-Plikowanie pliku znacznika czasu) make
. Działa i zwykle pozwala mi uniknąć pisania własnego kodu rozwiązywania zależności w sh (chociaż musiałem tutaj zrobić coś podobnego stat --printf %Y
).
Wszyscy wiedzą, że make
jest doskonałym narzędziem do kompilowania oprogramowania ... IMO jest również bardzo niedocenianym narzędziem do administrowania systemem i zadań skryptowych.
-z
Flaga, oczywiście, zakłada, że zdalny serwer używaIf-Modified-Since
nagłówków. To niekoniecznie musi tak być. W zależności od konfiguracji serwera może być konieczne zrobienie czegośETag
, sprawdzenieCache-Control
nagłówków lub sprawdzenie oddzielnego pliku sumy kontrolnej (np. Jeśli serwer udostępnia asha1sum
).