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이므로 들여 쓰기는 공백이 아니라 탭입니다. 물론 \
연속 선 뒤에 공백이 없어야합니다. 또는 백 슬래시 이스케이프를 제거하고 길게 만들 수도 있습니다. 거의 읽을 수없는 줄)
이 GNU make
레시피는 먼저 example.gz
( -z
에서 와 함께 사용하기 때문에) 라는 파일이 존재 하는지 확인하고 그렇지 않은 경우 파일을 curl
만듭니다 touch
. 터치하면 00:00 (오늘 오전 12시)의 타임 스탬프로 터치를 만듭니다.
그런 다음 사용 curl
의 -z
( --time-cond
만 다운로드) 옵션을 example.gz
그것을 다운로드 한 마지막 시간 이후 수정 된 경우. -z
실제 날짜 표현 또는 파일 이름을 지정할 수 있습니다. 파일 이름이 제공되면 파일의 수정 시간을 시간 조건으로 사용합니다.
그런 다음 local.dat
존재하지 않는 경우 시간 보다 오래된touch
타임 스탬프를 사용하여로 만듭니다 . 이것은 mtime 타임 스탬프를 얻기 위해 다음 명령을 사용 하기 위해 필요하기 때문에 필요 합니다 .example.gz
local.dat
stat
그런 다음 example.gz
보다 최신 타임 스탬프가있는 경우 local.dat
파이프 example.gz
에 transmogrify
출력을로 리디렉션합니다 local.dat
.
마지막으로 부기 및 정리 작업을 수행합니다.
example.gz
전체 파일이 아닌 타임 스탬프 만 유지하면되기 때문에 잘립니다.
touch
es 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
) 무언가를 수행해야 할 수도 있습니다 .