Versuchen Sie so etwas in Ihrem 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
(Hinweis: Dies ist ein Makefile, daher sind die Einrückungen Tabulatoren und keine Leerzeichen. Es ist auch wichtig, dass nach \den Fortsetzungszeilen keine Leerzeichen mehr vorhanden sind. Alternativ können Sie die Backslash-Escapezeichen entfernen und es lang machen. fast unlesbare Zeile)
Dieses GNU- makeRezept überprüft zunächst, ob eine aufgerufene Datei example.gzvorhanden ist (da wir sie mit -zin verwenden werden curl), und erstellt sie mit, touchwenn dies nicht der Fall ist. Die Berührung erstellt es mit einem Zeitstempel von 00:00 (12 Uhr des aktuellen Tages).
Dann verwendet es curl‚s -z( --time-cond) Option , um nur herunterladen , example.gzwenn es seit dem letzten Mal geändert wurde es heruntergeladen wurde. -zkann ein tatsächlicher Datumsausdruck oder ein Dateiname angegeben werden. Wenn ein Dateiname angegeben wird, wird die Änderungszeit der Datei als Zeitbedingung verwendet.
Wenn local.datdies nicht der Fall ist, wird es anschließend mit toucheinem Zeitstempel erstellt, der garantiert älter als der von ist example.gz. Dies ist erforderlich, da local.datder nächste Befehl vorhanden sein muss stat, um seinen Zeitstempel mtime abzurufen.
Wenn dann example.gzhat einen Zeitstempel neuer ist als local.dates Leitungen example.gzin transmogrifyund leitet die Ausgabe zu local.dat.
Schließlich erledigt es die Buchhaltung und Bereinigung:
- es wird abgeschnitten
example.gz(weil Sie nur einen Zeitstempel und nicht die gesamte Datei behalten müssen)
touches example.gzso, dass es den gleichen Zeitstempel wie hatlocal.dat
Das .PHONY-Ziel stellt sicher, dass das local.datZiel immer ausgeführt wird, auch wenn die Datei mit diesem Namen bereits vorhanden ist.
Vielen Dank an @Toby Speight für den Hinweis in den Kommentaren, dass meine Originalversion nicht funktionieren würde und warum.
Alternativ, wenn Sie die Datei direkt transmogrifyweiterleiten möchten, ohne sie zuerst in das Dateisystem herunterzuladen:
.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
HINWEIS: Dies ist größtenteils ungetestet und erfordert möglicherweise einige geringfügige Änderungen, um die Syntax genau richtig zu machen. Das Wichtigste dabei ist die Methode, keine Copy-Paste-Cargo-Kult-Lösung.
Ich verwende seit Jahrzehnten Variationen dieser Methode (dh toucheine Zeitstempeldatei) mit make. Es funktioniert und ermöglicht mir normalerweise zu vermeiden, dass ich meinen eigenen Code für die Auflösung von Abhängigkeiten in sh schreiben muss (obwohl ich stat --printf %Yhier etwas Ähnliches tun musste ).
Jeder weiß, dass makees ein großartiges Tool zum Kompilieren von Software ist ... IMO ist es auch ein sehr unterbewertetes Tool für Systemadministrations- und Skriptaufgaben.
-zFlag setzt natürlich voraus, dass der Remote-ServerIf-Modified-SinceHeader verwendet. Dies muss nicht unbedingt der Fall sein. Abhängig von der Serverkonfiguration müssen Sie möglicherweise stattdessen etwas tunETag, indem SieCache-ControlHeader überprüfen oder eine separate Prüfsummendatei überprüfen (z. B. wenn der Server eine bereitstelltsha1sum).