卷曲以获取以下位置后的远程文件名

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)

  • 这对我不起作用,保存的文件名仍然是download_script.php?src_id = 10872格式.我在我的macbook pro上运行curl 7.30.0 (13认同)
  • 在OSX上不使用curl:curl 7.42.1(x86_64-apple-darwin14.4.0)libcurl/7.42.1 SecureTransport zlib/1.2.5 libssh2/1.5.0 (3认同)
  • 正如@Diskutant"在一个答案中评论"下面.这种情况在"内容 - 处置:附件"中有些常见.filename = foo.txt`.周围的空间中的'='的原因(参见:https://gist.github.com/jnewman/23c993ef50bcd69f9086fcd4e2594928) (3认同)
  • 如果你使用`localhost`有其他人遇到这个,你必须把它变成`http:// localhost`或`-J`被忽略 (2认同)

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)

  • 谢谢!它在文件名末尾带了一个问号,所以我在你的grep和sed命令之间加了一个`tr -d'\ r \n'`,它工作得非常好. (5认同)
  • 请参阅@ jmanning2k的答案并使用-J选项 (2认同)
  • 卷曲7.26.0我可以通过'curl -sI $ url |来获取文件名 grep -oP'(?<= Location :)(^\s] +'| xargs basename'. (2认同)
  • 第一个`curl`可能还需要`-L`选项。 (2认同)
  • 我不得不使用`filename=$(curl -sI $url | grep -o -E 'location:.*$' | sed -e 's/location:=//' | xargs basename)` (2认同)

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


Cha*_*ert 6

我想要一个适用于较旧和较新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)