wget拒绝仍会下载文件

18

我只想要文件夹结构,但是我无法使用wget完成。相反,我正在使用以下命令:

wget -R pdf,css,gif,txt,png -np -r http://example.com

应该会拒绝-R后的所有文件,但是看起来wget仍在下载文件,然后在删除它。

有没有更好的方法只获取文件夹结构?

TTP请求已发送,等待响应... 200 OK 长度:136796(134K) [application/x-download] 保存为: “example.com/file.pdf”

100%[=====================================>] 136,796 853K/s in 0.2s

2012-10-03 03:51:41 (853 KB/s) - “example.com/file.pdf” 已保存 [136796/136796]

删除 example.com/file.pdf 因为它应该被拒绝。

如果有人想知道,这是为一个客户而做的,他们可以告诉我文件夹结构,但这很麻烦,因为他们的IT人员必须这样做,所以我想自己获取它。


也许你应该在http://unix.stackexchange.com/上询问这个问题。 - Konstantin V. Salikhov
你最好从客户那里获取结构。wget,特别是使用-np选项,可能会错过未直接或间接链接到索引文件的目录。 - Shawn Chin
1
可能是重复问题:https://dev59.com/-mTWa4cB1Zd3GeqPACTq - Shawn Chin
@ShawnChin 这个程序只会从他们的网站下载,所有需要的文件夹都有链接。不过还是谢谢你。 - Michael Ozeryansky
1个回答

30

这似乎是 wget 的设计方式。在进行递归下载时,即使非叶子文件与拒绝列表匹配,它们仍然会被下载,以便可以从中获取链接,然后再被删除。

从代码注释中可以看出(recur.c):

如果指定了 --delete-after,或者我们加载了此被拒绝的(例如通过 -R)HTML 文件,只是为了收集其超链接,则无论哪种情况,都会删除本地文件。

我们曾经在一个项目中遇到过类似问题。我们需要镜像一个需要身份验证的网站,但 wget 即使应该拒绝这些 URL,它仍然会访问 logout 页面。我们找不到任何更改 wget 行为的选项。

我们最终的解决方案是下载、修改并构建自己的版本的 wget。可能有更优雅的方法,但我们使用的快速修复方法是将以下规则添加到download_child_p()例程的末尾(根据您的要求进行修改):

  /* Extra rules */
  if (match_tail(url, ".pdf", 0)) goto out;
  if (match_tail(url, ".css", 0)) goto out;
  if (match_tail(url, ".gif", 0)) goto out;
  if (match_tail(url, ".txt", 0)) goto out;
  if (match_tail(url, ".png", 0)) goto out;
  /* --- end extra rules --- */

  /* The URL has passed all the tests.  It can be placed in the
     download queue. */
  DEBUGP (("Decided to load it.\n"));

  return 1;

 out:
  DEBUGP (("Decided NOT to load it.\n"));

  return 0;
}

4
哇!他们应该让“拒绝”功能像那样工作。但我也意识到wget是为了执行特定的任务而设计的。谢谢。 - Michael Ozeryansky
1
点赞这个答案,因为它是一个很棒的 DIY 解决方案,但我仍然很失望没有更好的方法。 - taranaki
正在处理同一个问题... logout.html。似乎早在2009年就已经广为人知,而作者们显然决定保留这个“漏洞”https://linuxgazette.net/160/misc/lg/how_to_make_wget_exclude_a_particular_link_when_mirroring.html。 - J. Win.
在当前版本(wget-1.19.5)中,该函数被称为download_child,您必须设置拒绝的原因,否则默认为成功并访问页面:/额外规则/如果(match_tail(url,“logout.html”,0)) { blacklist_add(blacklist,url); DEBUGP(((“检测到注销URL。\ n”,url))); reason = WG_RR_BLACKLIST; 转到out; }/* ---结束额外规则--- */ - J. Win.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接