wget与http下载中的通配符


53

我需要使用wget下载文件,但是我不知道确切的文件名。

https://foo/bar.1234.tar.gz

根据手册页,使用wget可以在处理ftp站点时关闭和打开glob,但是我有一个http url。

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

我尝试过的事情。

/usr/local/bin/wget -r "https://foo/bar.*.tar.gz" -P /tmp

更新资料

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

/usr/local/bin/wget -r "https://foo/" -P /tmp -A "bar.*.tar.gz"

更新资料

从答案来看,这是最终有效的语法。

/usr/local/bin/wget -r -l1 -np "https://foo" -P /tmp -A "bar*.tar.gz"

2
这与您要查找的内容不完全相同,而是相关的:Curl可以使用基本通配符,例如:curl "http://example.com/picture[1-10].jpg" -o "picture#1.jpg"
Hello World

1
对我来说一个-e robots=off
陷阱

我发现添加标志-nH--cut-dirs=<number>也是有用的
兰德尔

Answers:


62

我认为这些开关可以满足您的需求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.

$ wget -r --no-parent -A 'bar.*.tar.gz' http://url/dir/

15

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

传统上(或历史上),Web服务器通常执行镜像目录层次结构(对于某些文件(例如Apache),这是必不可少的),甚至提供类似于文件系统的目录索引。但是,关于HTTP协议的任何要求都不需要。

这是很重要的,因为如果您要对所有的子路径应用glob 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.htmlindex.html,则它会下载并提取作为其子路径的链接。2 所述的-A开关仅仅是一个在这个过程中应用的滤波器。

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


1.当然,FTP URL也是URL。但是,尽管我对FTP协议了解不多,但基于其性质,我猜测它可能是允许透明glob形式的形式。

2.这意味着可能存在一个将不包含的有效URL http://foo/bar/alt/whatever/stuff/,因为它没有以任何方式链接到与链接的事物集中的任何内容。与文件系统不同,Web服务器没有义务使其内容的布局透明,也不必以直观的方式进行。http://foo/bar/index.html


0

上面的“ -A模式”解决方案可能不适用于某些网页。这是我的解决方法,有两个wget:

  1. wget 这一页
  2. grep 图案
  3. wget 文件)

示例:假设这是新闻播客页面,并且我希望页面顶部有5个mp3文件:

wget -nv -O- https://example/page/ |
 grep -o '[^"[:space:]]*://[^"[:space:]]*pattern[^"[:space:]]*\.mp3' |
  head -n5 | while read x; do
    sleep $(($RANDOM % 5 + 5))  ## to appear gentle and polite
    wget -nv "$x"
  done

grep寻找包含双引号没有空间的链接://和我的文件名pattern


这里的RANDOM是什么?
royki

一个shell变量,请参见bash手册页。随机每次引用此参数时,都会生成0到32767之间的随机整数。
夜班
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.