我需要使用 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.html
,http://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 服务器没有义务使其内容的布局透明,也不需要以直观明显的方式进行。