在追踪位置后,curl以抓取远程文件名

使用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 

如果你可以在不知道名字的情况下下载文件,那将是非常好的,如果没有,那么有没有另一种方法可以通过命令行快速下载redirect的文件?

如果你有一个curl的最新版本(7.21.2或更高版本),请参阅@ jmanning2k的回答 。

我有一个老版本的curl (像雪豹一样的7.19.7),做两个请求:一个HEAD从响应头获取文件名,然后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 

远程端使用Content-Disposition标头发送文件名。

curl 7.21.2或更新版本会自动执行--remote-header-name / -J

 curl -O -J -L $url 

我想评论jmanning2k的答案,但作为一个新用户,我不能,所以我试图编辑他的post是允许的,但编辑被拒绝说它应该是一个评论。

无论如何,看到这个评论他的回答谢谢。

这似乎只工作,如果头看起来像filename=pythoncomplete.vim像在这个例子中,但一些网站发送一个头,看起来像filename*=UTF-8' 'filename.zip' ,一个不被卷发识别7.28 0.0

我想要一个适用于新旧Mac的解决scheme,David提供给Snow Leopard的遗留代码在小牛下performance不佳。 这是我根据David的代码创build的一个函数:

 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" 

请注意,某些configuration不当的networking服务器将使用“文件名”作为密钥来提供名称,其中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