我正在尝试使用 .NET 从网站通过 HTTP 下载文件wget
。
当我使用时:
wget http://abc/geo/download/?acc=GSE48191&format=file
我只得到一个名为index.html?acc=GSE48191
.
当我使用时:
wget http://abc/geo/download/?acc=GSE48191&format=file -o asd.rpm
我明白了asd.rpm
,但我想用实际名称下载,并且不想手动更改下载文件的名称。
答案1
wget --content-disposition 'https://www.ncbi.nlm.nih.gov/geo/download/?acc=GSE48191&format=file'
您正在下载的文件是一个tar
存档(二进制文件),由 Web 服务器的动态链接提供。wget
通常会使用您正在使用的 URL 的一部分来保存文件,但在这种情况下,这只是一个 REST API 端点(或类似的东西),因此该名称使用起来不友好(它仍然是一个有效的名称,并且文件内容将相同)。
但是,在这种情况下,服务器提供了一个包含实际文件名的“Content Disposition”标头,wget
如果您使用该选项,则可以使用该标头--content-disposition
。这个选项在我的手册中被标记为“实验性” wget
。
您还需要引用 URL,以便 shell 不会解释其中的&
和?
字符。
使用等效的东西curl
:
curl -J -O 'https://www.ncbi.nlm.nih.gov/geo/download/?acc=GSE48191&format=file'
或者,使用等效的长选项:
curl --remote-header-name --remote-name 'https://www.ncbi.nlm.nih.gov/geo/download/?acc=GSE48191&format=file'
下载文件后,您需要解压它:
tar -xvf GSE48191_RAW.tar
由于此特定存档的创建方式,这会将存档的文件解压到当前的目录(因此创建一个新目录,将存档移到那里并解压它可能是一个好主意)。此存档中的文件是gzip
压缩CEL
文件。
答案2
shell 对字符进行通常的解释,特别?
是作为通配符(这在这里并不重要)和&
“放入后台”。您应该已经注意到后者,因为 shell 响应与直接命令不同。
所以你需要引用:
wget 'http://abc/geo/download/?acc=GSE48191&format=file'