program tip

다음 위치 후 원격 파일 이름을 가져 오기 위해 컬

radiobox 2020. 11. 3. 07:54
반응형

다음 위치 후 원격 파일 이름을 가져 오기 위해 컬


curl을 사용하여 파일을 다운로드 할 때 어떻게 링크 위치를 따라 출력 파일 이름에 사용합니까 (원격 파일 이름을 미리 알지 못함)?

예를 들어, 아래 링크를 클릭하면 "pythoncomplete.vim"이라는 파일 이름을 다운로드합니다. 그러나 curl의 -O 및 -L 옵션을 사용하면 파일 이름은 단순히 원래의 원격 이름, 서투른 "download_script.php? src_id = 10872"입니다.

curl -O -L http://www.vim.org/scripts/download_script.php?src_id=10872

올바른 파일 이름으로 파일을 다운로드하려면 미리 파일 이름을 알아야합니다.

curl -o pythoncomplete.vim -L http://www.vim.org/scripts/download_script.php?src_id=10872

이름을 미리 모르고 파일을 다운로드 할 수 있다면 좋을 것입니다. 그렇지 않다면 명령 줄을 통해 리디렉션 된 파일을 빠르게 풀다운 할 수있는 다른 방법이 있습니까?


원격 측은 Content-Disposition 헤더를 사용하여 파일 이름을 보냅니다.

curl 7.21.2 이상은 --remote-header-name/ 를 지정하면이 작업을 자동으로 수행합니다 -J.

curl -O -J -L $url

최신 버전 curl(7.21.2 이상)이있는 경우 @ jmanning2k의 답변을 참조하십시오 .

이전 버전 curl(Snow Leopard와 함께 제공되는 7.19.7과 같은)을 사용 중입니다. 두 가지 요청을 수행합니다. a HEAD응답 헤더에서 파일 이름을 가져 오고 a GET:

url="http://www.vim.org/scripts/download_script.php?src_id=10872"
filename=$(curl -sI  $url | grep -o -E 'filename=.*$' | sed -e 's/filename=//')
curl -o $filename -L $url

wget대신 사용할 수있는 경우 curl:

wget --content-disposition $url

jmanning2k의 답변에 댓글을 달고 싶었지만 신규 사용자로서 할 수 없어서 허용 된 글을 수정하려고했지만 댓글로 간주 된다며 수정이 거부되었습니다. 한숨

어쨌든, 그의 답변 감사에 대한 코멘트로 참조하십시오.

이것은 헤더가 filename=pythoncomplete.vim예제 같이 보이는 경우에만 작동하는 것처럼 보이지만 일부 사이트 filename*=UTF-8' 'filename.zip'는 curl 7.28.0에서 인식되지 않는 것처럼 보이는 헤더를 보냅니다.


저는 구형 및 신형 Mac 모두에서 작동하는 솔루션을 원했고 David가 Snow Leopard에 제공 한 레거시 코드는 Mavericks에서 제대로 작동하지 않았습니다. 다음은 David의 코드를 기반으로 만든 함수입니다.

function getUriFilename() {
    header="$(curl -sI "$1" | tr -d '\r')"

    filename="$(echo "$header" | grep -o -E 'filename=.*$')"
    if [[ -n "$filename" ]]; then
        echo "${filename#filename=}"
        return
    fi

    filename="$(echo "$header" | grep -o -E 'Location:.*$')"
    if [[ -n "$filename" ]]; then
        basename "${filename#Location\:}"
        return
    fi

    return 1
}

이를 정의하면 다음을 실행할 수 있습니다.

url="http://www.vim.org/scripts/download_script.php?src_id=10872"
filename="$(getUriFilename $url)"
curl -L $url -o "$filename"

잘못 구성된 특정 웹 서버는 "파일 이름"을 키로 사용하여 이름을 제공합니다. 여기서 RFC2183은 "파일 이름"이어야한다고 지정합니다. curl은 후자의 경우 만 처리합니다.


Apache Archiva 아티팩트 저장소에 대한 위의 답변을 사용하여 최신 버전을 가져 오는 예입니다. curl은 Location 줄을 반환하고 파일 이름은 줄의 끝에 있습니다. 파일 이름 끝에있는 CR을 제거해야합니다.

url="http://archiva:8080/restServices/archivaServices/searchService/artifact?g=com.imgur.backup&a=snapshot-s3-util&v=LATEST"
filename=$(curl --silent -sI -u user:password $url | grep Location | awk -F\/ '{print $NF}' | sed 's/\r$//')
curl --silent -o $filename -L -u user:password $url

참고URL : https://stackoverflow.com/questions/6881034/curl-to-grab-remote-filename-after-following-location

반응형