http 오류 시 파일을 저장하지 않는다는 컬/wget 옵션이 있습니까?

StackOverflow https://stackoverflow.com/questions/89989

  •  01-07-2019
  •  | 
  •  

문제

스크립트에 많은 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

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top