다음 위치 후 원격 파일 이름을 가져 오기 위해 컬
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
'program tip' 카테고리의 다른 글
장고 비밀번호 생성기 (0) | 2020.11.03 |
---|---|
Java에서 '(int) (char) (byte) -2'가 65534를 생성하는 이유는 무엇입니까? (0) | 2020.11.03 |
~ / bin을 내 경로에 어떻게 추가합니까? (0) | 2020.11.03 |
SELECT 쿼리에 대한 SQL Server 잠금 이해 (0) | 2020.11.03 |
Android에서 콜백이란 무엇입니까? (0) | 2020.11.03 |