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
(注:これはMakefileであるため、インデントはスペースではなくタブです。もちろん\、継続行の後にスペースがないことも重要です-または、バックスラッシュエスケープを削除して1つ長くします。ほとんど読めない行)
このGNU makeレシピでは、最初にというファイルがexample.gz存在することを確認し(-zinで使用するためcurl)、touch存在しない場合はで作成します。タッチは00:00(当日の午前12時)のタイムスタンプで作成します。
次に、curlの-z(--time-cond)オプションを使用しexample.gzて、前回のダウンロード以降に変更されている場合にのみダウンロードします。 -z実際の日付式またはファイル名を指定できます。ファイル名を指定すると、ファイルの変更時刻が時間条件として使用されます。
その後、local.dat存在しない場合は、それよりも古いtouchことが保証されたタイムスタンプを使用して、で作成します。次のコマンドがmtimeタイムスタンプを取得するために使用する必要があるため、これは必要です。example.gzlocal.datstat
次に、example.gzタイムスタンプがよりも新しい場合local.dat、パイプexample.gzを使用transmogrifyして出力をにリダイレクトしますlocal.dat。
最後に、簿記とクリーンアップを行います。
- それは切り捨て
example.gz(あなただけのタイムスタンプではなく、ファイル全体を維持する必要があるため)
touches example.gzと同じタイムスタンプを持つようにlocal.dat
.PHONYターゲットはlocal.dat、その名前のファイルがすでに存在する場合でも、ターゲットが常に実行されるようにします。
元のバージョンでは機能しないとコメントで指摘した@Toby Speightに感謝します。
あるいは、transmogrify最初にファイルシステムにダウンロードせずにファイルを直接パイプしたい場合:
.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
注:これは大部分がテストされていないため、構文を正確に正しくするために若干の変更が必要になる場合があります。ここで重要なのはメソッドであり、コピー/ペーストの貨物カルトソリューションではありません。
私は何十年もの間、この方法のバリエーション(touchタイムスタンプファイルの作成など)を使用してきましたmake。それは機能し、通常、私は自分の依存関係解決コードをshで記述する必要を回避できます(stat --printf %Yここで同様のことをしなければなりませんでした)。
makeソフトウェアをコンパイルするための優れたツールであることは誰もが知っています... IMOは、システム管理およびスクリプトタスクのための非常に過小評価されているツールでもあります。
-zもちろん、このフラグは、リモートサーバーがIf-Modified-Sinceヘッダーを使用することを前提としています。これは必ずしもそうであるとは限りません。サーバーの設定によっては、代わりにを使用しETagたり、Cache-Controlヘッダーをチェックしたり、別のチェックサムファイルをチェックしたりする必要があります(サーバーがを提供している場合などsha1sum)。