http 오류 시 파일을 저장하지 않는다는 컬/wget 옵션이 있습니까?
문제
스크립트에 많은 URL을 다운로드하고 싶지만 HTTP 오류로 이어지는 URL을 저장하고 싶지 않습니다.
맨 페이지에서 알 수 있는 한, 둘 다 curl
또는 wget
그러한 기능을 제공합니다.다른 다운로더에 대해 아는 사람이 있나요?
해결책
바로 이 목적을 위해 방금 설정한 라이너 중 하나입니다.
(단일 파일에서만 작동하며 다른 파일에도 유용할 수 있음)
A=$$; ( wget -q "http://foo.com/pipo.txt" -O $A.d && mv $A.d pipo.txt ) || (rm $A.d; echo "Removing temp file")
그러면 원격 호스트에서 파일 다운로드를 시도합니다.오류가 있는 경우 파일이 보관되지 않습니다.다른 모든 경우에는 유지되고 이름이 변경됩니다.
다른 팁
내 생각 엔 -f
옵션 curl
당신이 원하는 것을 수행합니다:
-f
,--fail
(HTTP) 서버 오류가 발생하면 자동으로 실패합니다(출력 없음).이것은 스크립트 등이 실패한 시도를 더 잘 처리 할 수 있도록 더 잘 활성화하기 위해 수행됩니다.정상적인 경우 HTTP 서버가 문서를 전달하지 못하는 경우, HTML 문서를 반환합니다 (종종 이유와 그 이상을 설명합니다).이 플래그는 컬이 그 결과를 출력하는 것을 방지하고 오류 22를 반환합니다.[...]
그러나 응답이 실제로 301 또는 302 리디렉션인 경우 대상에서 오류가 발생하더라도 계속 저장됩니다.
$ curl -fO http://google.com/aoeu
$ cat aoeu
<HTML><HEAD><meta http-equiv="content-type" content="text/html;charset=utf-8">
<TITLE>301 Moved</TITLE></HEAD><BODY>
<H1>301 Moved</H1>
The document has moved
<A HREF="http://www.google.com/aoeu">here</A>.
</BODY></HTML>
막다른 골목까지 리디렉션을 따르려면 다음을 제공하세요. -L
옵션:
-L
,--location
(http/https) 서버가 요청 된 페이지가 다른 위치로 이동했다고보고하는 경우 (위치로 표시됨 :헤더 및 3xx 응답 코드),이 옵션은 CURL을 새 장소에서 요청하게 만듭니다.[...]
고대 실..해결책을 찾기 위해 여기에 왔습니다 ...이를 위해 일부 쉘 코드를 작성했습니다.
if [ `curl -s -w "%{http_code}" --compress -o /tmp/something \
http://example.com/my/url/` = "200" ]; then
echo "yay"; cp /tmp/something /path/to/destination/filename
fi
출력을 tmp 파일로 다운로드하고 상태가 200인 경우에만 출력 파일을 생성/덮어씁니다.용도가 좀 다르네요..제 경우에는 출력을 생성하는 데 10초 이상이 걸립니다.그리고 그 기간 동안 대상 파일이 공백으로 유지되는 것을 원하지 않았습니다.
제안할 해결 방법이 있습니다. 파일을 다운로드하지만 크기가 0인 경우(404가 발생하는 경우 발생) 파일도 제거합니다.
wget -O <filename> <url/to/file>
if [[ (du <filename> | cut -f 1) == 0 ]]; then
rm <filename>;
fi;
zsh에서는 작동하지만 다른 쉘에도 적용할 수 있습니다.
하지만 다음을 제공하는 경우에만 먼저 저장됩니다. -O
옵션
메모: 나는 이것이 오래된 질문이라는 것을 알고 있지만 다음을 사용하는 사람들에게 더 나은 해결책을 찾았다고 믿습니다. wget
위의 답변 중 어느 것보다 제공됩니다.
wget -q $URL 2>/dev/null
HTTP 상태 코드가 200 범위(Ok) 내에 있는 경우에만 대상 파일을 로컬 디렉터리에 저장합니다.
또한 요청에 오류가 있을 때마다 오류를 인쇄하는 등의 작업을 수행하려면 다음을 확인할 수 있습니다. wget 종료 코드 0이 아닌 값의 경우 다음과 같습니다.
wget -q $URL 2>/dev/null
if [ $? != 0]; then
echo "There was an error!"
fi
이것이 나와 같은 문제에 직면한 누군가에게 도움이 되기를 바랍니다.
업데이트:나는 이것을 내 프로젝트를 위해 좀 더 스크립트 가능한 형식으로 만들었고 다음과 같이 공유하고 싶다고 생각했습니다.
function dl {
pushd . > /dev/null
cd $(dirname $1)
wget -q $BASE_URL/$1 2> /dev/null
if [ $? != 0 ]; then
echo ">> ERROR could not download file \"$1\"" 1>&2
exit 1
fi
popd > /dev/null
}
저장하지 않고도 파일을 다운로드할 수 있습니다. "-O -"
옵션으로
wget -O - http://jagor.srce.hr/
다음에서 더 많은 정보를 얻을 수 있습니다. http://www.gnu.org/software/wget/manual/wget.html#Advanced-Usage