在 http 下载中使用通配符的 wget

spu*_*der 65 wget

我需要使用 wget 下载文件,但是我不知道文件名到底是什么。

https://foo/bar.1234.tar.gz
Run Code Online (Sandbox Code Playgroud)

根据手册页,wget 允许您在处理 ftp 站点时关闭和打开 globbing,但是我有一个 http url。

使用 wget 时如何使用通配符?我正在使用 gnu wget。

我尝试过的事情。

/usr/local/bin/wget -r "https://foo/bar.*.tar.gz" -P /tmp
Run Code Online (Sandbox Code Playgroud)

更新

使用 -A 会导致下载服务器上以 .tar.gz 结尾的所有文件。

/usr/local/bin/wget -r "https://foo/" -P /tmp -A "bar.*.tar.gz"
Run Code Online (Sandbox Code Playgroud)

更新

从答案来看,这是最终起作用的语法。

/usr/local/bin/wget -r -l1 -np "https://foo" -P /tmp -A "bar*.tar.gz"
Run Code Online (Sandbox Code Playgroud)

slm*_*slm 78

我认为这些开关可以满足您的需求wget

   -A acclist --accept acclist
   -R rejlist --reject rejlist
       Specify comma-separated lists of file name suffixes or patterns to 
       accept or reject. Note that if any of the wildcard characters, *, ?,
       [ or ], appear in an element of acclist or rejlist, it will be 
       treated as a pattern, rather than a suffix.

   --accept-regex urlregex
   --reject-regex urlregex
       Specify a regular expression to accept or reject the complete URL.
Run Code Online (Sandbox Code Playgroud)

例子

$ wget -r --no-parent -A 'bar.*.tar.gz' http://url/dir/
Run Code Online (Sandbox Code Playgroud)


gol*_*cks 17

这不能直接与 HTTP 一起使用有一个很好的理由,那就是 URL不是文件路径,尽管/用作分隔符可以使它看起来像一个,并且它们有时确实对应。1

传统上(或历史上),Web 服务器通常会镜像目录层次结构(对于某些——例如,Apache——这是一种整体),甚至提供非常类似于文件系统的目录索引。但是,HTTP 协议没有任何要求。

这很重要,因为如果您想http://foo/bar/将 glob应用于. 那里没有可供搜索的文件系统。 例如,仅仅因为您知道有页面http://foo/bar/one.htmlhttp://foo/bar/two.html并不意味着您可以通过http://foo/bar/. 服务器为此返回 404 完全符合协议。或者它可以返回一个文件列表。或者它可以给你发送一张漂亮的 jpg 图片。等等。

所以这里没有wget可以利用的标准。AFAICT,wget通过主动检查每个页面中的链接来镜像路径层次结构。换句话说,如果您递归地镜像http://foo/bar/index.html它下载index.html,然后提取作为其子路径的链接。2 所述的-A开关仅仅是一个在这个过程中应用的滤波器。

简而言之,如果您知道这些文件已在某处编入索引,则可以使用-A. 如果没有,那么你就不走运了。


1. 当然,FTP URL 也是 URL。但是,虽然我对 FTP 协议知之甚少,但我猜基于它的性质,它可能是一种允许透明通配符的形式。

2.这意味着,有可能是一个有效的URLhttp://foo/bar/alt/whatever/stuff/不会包含,因为它不挂任何东西的一套东西链接到任何方式http://foo/bar/index.html。与文件系统不同,Web 服务器没有义务使其内容的布局透明,也不需要以直观明显的方式进行。