Nic*_* S. 69 unix command-line 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
Run Code Online (Sandbox Code Playgroud)
要下载具有正确文件名的文件,您必须事先知道文件的名称:
curl -o pythoncomplete.vim -L http://www.vim.org/scripts/download_script.php?src_id=10872
Run Code Online (Sandbox Code Playgroud)
如果您可以在不事先知道名称的情况下下载文件,那将是非常好的,如果没有,是否有另一种方法可以通过命令行快速下载重定向文件?
jma*_*g2k 143
远程端使用Content-Disposition标头发送文件名.
卷曲7.21.2或更新如果指定--remote-header-name
/ 自动执行此操作-J
.
curl -O -J -L $url
Run Code Online (Sandbox Code Playgroud)
Dav*_*ski 31
如果您有curl
(7.21.2或更高版本)的最新版本,请参阅@ jmanning2k的答案.
我有一个旧版本curl
(如雪豹附带的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
Run Code Online (Sandbox Code Playgroud)
Jac*_*ekM 11
如果您可以使用wget
而不是curl
:
wget --content-disposition $url
Run Code Online (Sandbox Code Playgroud)
Dis*_*ant 10
我想评论jmanning2k的答案,但作为一个新用户,我不能,所以我试图编辑他的帖子是允许但编辑被拒绝说它应该是一个评论.叹
无论如何,看到这是对他的回答的评论谢谢.
这似乎只有在标题看起来像filename=pythoncomplete.vim
示例中时才有效,但是有些网站发送的标题看起来像是filename*=UTF-8' 'filename.zip'
卷曲不能识别的标题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
}
Run Code Online (Sandbox Code Playgroud)
通过此定义,您可以运行:
url="http://www.vim.org/scripts/download_script.php?src_id=10872"
filename="$(getUriFilename $url)"
curl -L $url -o "$filename"
Run Code Online (Sandbox Code Playgroud)