我一直想知道如何通过 Linux shell(我有 wget、curl)下载文件,这些文件没有要下载的文件的完整 URL,但只有在访问特定 URL 时才会将完整 URL 传递到浏览器。然而,当我尝试通过Linux shell(使用wget或curl)下载它时,我得到的只是一个HTML文件。
例如,我想从这里下载几个 MB 大文件:
http://www.ebi.ac.uk/ena/data/view/U00096.3&display=fasta&download=fasta&filename=entry.fasta
因此,当我将其粘贴到浏览器中时,我会看到“另存为”对话框,让我保存“entry.fasta”文件而不是另一个 HTML 文件。我按照建议尝试了curl -O -L -J这个问题,但也没有成功。
答案1
您提供的 URL 可以很好地下载,例如:
wget "URL"
curl -O "URL"
正如评论中提到的:引用。总是引用!
像这样的字母&
在 shell 中具有特殊含义,如果没有它们,URL 将不会被解释为您想要的。
至于不知道文件名就下载– 我仍然不太确定你的意思,但有一些注意事项:
这是特定地点对于 ebi.ac.uk
这网址提供的是一种特殊形式统一资源标识符。您很可能对查询部分感兴趣,更具体地说是第一部分:U00096.3
。
您可以更改它以代表其他文件和范围。例如下载U00000
说U00096
:
curl -O "http://www.ebi.ac.uk/ena/data/view/U00000-U00096&display=fasta&download=fasta&filename=U00000-U00096.fasta"
^^^^ data ^^^
文件名部分只是关于如何命名文件的建议。您可以将其更改为您想要的任何内容。例如:filename=myown.fasta
– 不会改变什么仅下载服务器->网络浏览器建议的名称,也可以由curl等使用。
该网站上有很多搜索和列表的可能性,您必须四处浏览。
更多关于正在发生的事情
当您单击下载链接或使用curl 或wget 等工具时,系统会将特定文件的请求发送到位于ebi.ac.uk 的服务器。在您的示例中,它可能有一个引用设置为:
http://www.ebi.ac.uk/ena/data/view/U00096.3
GET 查询报告为:
query['display'] = fasta
query['download'] = fasta
query['filename'] = entry.fasta
服务器响应一些内容,例如:
Content-Disposition: attachment; filename=entry.fasta
这是服务器将文件名建议返回给客户端的一种方式。如果您使用带有选项的curl版本,-J
您可以使用此选项按此名称保存文件:即:
curl -OJ "URL"
如上所述
这是完全特定于站点的,并且服务器上解释 URL 的方式与站点的设置方式有关。
在不同的主机上使用带有查询部分的另一个设置,也可以为您提供从服务器filename=foo.txt
命名的实际文件。foo.txt
对于这个网站 ebi.ac.uk,该文件不是一个文件,而是使用数据库查询动态生成的内容。查询结果被合并到一个文件中并提供给最终用户。
答案2
如果没有引号,shell 会看到&
并将其解释为“在后台运行行中直到 & 的所有内容,然后继续解释/运行该行的其余部分”。如果加上引号,则&
只是 URL 字符串的一部分。
您的 URL 中有 3 个&
s,因此如果没有引号,它将运行四个命令,前三个作为后台作业:
wget http://www.ebi.ac.uk/ena/data/view/U00096.3 &
display=fasta &
download=fasta &
filename=entry.fasta
修复方法是引用 URL:
wget 'http://www.ebi.ac.uk/ena/data/view/U00096.3&display=fasta&download=fasta&filename=entry.fasta'
此处使用单引号即可,但如果您想在 URL 中嵌入任何变量的值,则需要使用双引号。
答案3
也许你可以小心使用递归下载的设施wget
。所以如果你
wget -r http://gcc-melt.org/
gcc-melt.org
您将从站点下载“每个”可访问的文件
(但请阅读的文档wget
在尝试之前)
附言。我是该文件的所有者和作者http://gcc-melt.org/网站,因此请不要超载。