Tente algo assim em seu 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
(nota: isso é um Makefile, então os recuos são guias, não espaços. claro.
Também é importante que não haja espaços após o \
nas linhas de continuação - alternativamente, elimine as escapes de contrabarra e torne-a uma linha longa, quase ilegível)
Esta receita de make
do GNU primeiro verifica se existe um arquivo chamado example.gz
(porque vamos usá-lo com -z
em curl
) e cria com touch
se ele não o faz t. O toque cria um timestamp de 00:00 (12h do dia atual).
Em seguida, ele usa a opção curl
-z
( --time-cond
) para fazer o download apenas de example.gz
se tiver sido modificado desde a última vez em que foi baixado. -z
pode receber uma expressão de data real ou um nome de arquivo. Se for dado um nome de arquivo, ele usará o horário de modificação do arquivo como a condição de tempo.
Depois disso, se local.dat
não existir, ele será criado com touch
, usando um registro de data e hora garantido como mais antigo do que example.gz
. Isso é necessário porque local.dat
tem que existir para o próximo comando usar stat
para obter seu timestamp mtime.
Em seguida, se example.gz
tiver um registro de data e hora mais recente que local.dat
, ele canaliza example.gz
para transmogrify
e redireciona a saída para local.dat
.
Finalmente, ele faz a contabilidade & coisas de limpeza:
- trunca
example.gz
(porque você só precisa manter um registro de data e hora, e não o arquivo inteiro) -
touch
esexample.gz
para que tenha o mesmo timestamp quelocal.dat
O alvo .PHONY garante que o alvo local.dat
seja sempre executado, mesmo que o arquivo desse nome já exista.
Obrigado ao @Toby Speight por apontar nos comentários que minha versão original não funcionaria e por quê.
Como alternativa, se você quiser enviar o arquivo diretamente para transmogrify
sem baixá-lo primeiro no sistema de arquivos:
.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
OBSERVAÇÃO: isso não é testado, portanto, pode exigir algumas pequenas alterações para obter a sintaxe corretamente. O importante aqui é o método, não uma solução de copiar e colar carga-cult.
Eu tenho usado variações desse método (por exemplo, touch
-ing um arquivo de timestamp) com make
por décadas. Ele funciona, e geralmente me permite evitar ter que escrever meu próprio código de resolução de dependência no sh (embora eu tenha que fazer algo similar com stat --printf %Y
aqui).
Todo mundo sabe que make
é uma ótima ferramenta para compilar software ... O IMO também é uma ferramenta muito subestimada para tarefas administrativas e de script do sistema.