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 makeprzepis GNU najpierw sprawdza, czy plik o nazwie example.gzistnieje (ponieważ będziemy go używać z -zin curl), i tworzy go, touchjeśli nie ma. Dotyk tworzy go ze znacznikiem czasu 00:00 (12 rano bieżącego dnia).
Następnie używa opcji curls -z( --time-cond), aby pobrać tylko, example.gzjeśli został zmodyfikowany od czasu ostatniego pobrania. -zmoż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.datnie istnieje, tworzy go za touchpomocą znacznika czasu, który ma być starszy niż example.gz. Jest to konieczne, ponieważ local.datmusi istnieć, aby następne polecenie statmogło uzyskać znacznik czasu mtime.
Następnie, jeśli example.gzjest nowsza niż datownik local.dat, to rury example.gzna język transmogrifyi 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)
touches, example.gzaby miał ten sam znacznik czasu colocal.dat
Cel .PHONY zapewnia, że local.datcel 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 transmogrifybez 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 makejest doskonałym narzędziem do kompilowania oprogramowania ... IMO jest również bardzo niedocenianym narzędziem do administrowania systemem i zadań skryptowych.
-zFlaga, oczywiście, zakłada, że zdalny serwer używaIf-Modified-Sincenagłówków. To niekoniecznie musi tak być. W zależności od konfiguracji serwera może być konieczne zrobienie czegośETag, sprawdzenieCache-Controlnagłówków lub sprawdzenie oddzielnego pliku sumy kontrolnej (np. Jeśli serwer udostępnia asha1sum).