有没有办法禁止wget从父目录获取文件到给定深度?


11

wget具有-np禁止从任何父目录获取文件的选项。我需要类似的东西,但要灵活一些。考虑:

www.foo.com/bar1/bar2/bar3/index.html

我想得到所有东西,但不是(在树层次结构中)比bar2(!)“更高” 。因此bar2也应该获取而不是获取bar1

有没有办法使wget更具选择性?

背景:我正在尝试镜像具有类似逻辑结构的网站-起点,然后是向上,然后是向下。如果除之外还有其他工具wget更适合此类布局,请也告知我。

更新资料

或者,而不是指定可能的深度,例如“没有父母,除非他们匹配此URL”。

更新2

服务器上有一些结构,对吗?您可以将其可视化为树。因此,通常使用“ --no-parent”,您会从A点开始,然后一直下降。

我的愿望是向上的能力-可以说,允许向上X个节点,或者(相当于100%)允许向上B个节点(距离BA = X)。

在所有情况下,下降规则都由用户定义(例如,仅下降Y级)。

如何储存?实际上,这并不是真正的问题- wget默认情况下会重新创建服务器结构,这里没有什么可担心的,或者不需要修复任何内容。所以,用2个字-像往常一样。

更新3

下面的目录结构-假设每个目录中R-R.html等只有一个文件。当然,这可以简化,因为您可以拥有多个页面。

        R 
       / \
      B   G
     / \
    C   F
   / \
  A   D
 /
E 

A(A.html)是我的起点,X = 2(所以B是我想获取的最顶层节点)。在此特定示例中,这意味着获取除R.html和G.html之外的所有页面。A.html被称为“起点”,因为我必须从它而不是从B开始。

更新4

从更新3开始使用命名。

wget选项www.foo.com/B/C/A/A.html

问题是从目录B和以下目录获取所有页面的选项是什么(知道您必须从A.html开始)。


您想bar2获取,但不想要bar1吗?要住在哪里bar2?如果您不希望两个或多个Dirs具有相同名称的子目录,应该将其内容合并吗?几乎可以肯定,只是获得整个该死的站点,然后根据需要修剪/移动东西就更容易了。
Kilian Foth 2011年

@Kilian Foth,“获得整个该死的站点”是什么意思?拿来吗?一般而言,这太过分了,这可能意味着需要MB时获取TB。有关其余信息,请参见update2。
greenoldman 2011年

不明白你的意思。我唯一可以提出的解释是,您需要bar2目录及其所有内容。如果不是,请进行说明。
Faheem Mitha

@Faheem Mitha,“其内容” =“整个子树”。是的,这只是我相信的解释,而这正是我的意思。
greenoldman 2011年

Answers:


12

我没有尝试过,但是使用-I和-X可以满足您的需求。我的第一个尝试是

wget -m -I bar1/bar2 -X "*" http://www.foo.com/bar1/bar2/bar3/index.html

选项说明:

-m: 
   --mirror
       Turn on options suitable for mirroring.  This option turns on recursion and time-stamping, sets
       infinite recursion depth and keeps FTP directory listings.  It is currently equivalent to -r -N -l
       inf --no-remove-listing.
-I: list
   --include-directories=list
       Specify a comma-separated list of directories you wish to follow when downloading.  Elements of
       list may contain wildcards.
-X: list
   --exclude-directories=list
       Specify a comma-separated list of directories you wish to exclude from download.  Elements of list
       may contain wildcards.

4

您需要在URL末尾添加/,否则您将无法获得所需的内容。

如果要在www.myhostname.com/somedirectory上获取所有内容,则语法应如下所示:

wget -r -nH http://www.myhostname.com/somedirectory/

尝试无休止的/看看会发生什么。然后使用/尝试。


1
如果其中链接的页面引用此目录,它仍将升入更高的目录
EkriirkE 15-10-12

非常感谢带斜杠的提示!它帮助我解决了wget从相邻目录(兄弟姐妹)中获取的不相关文件的问题。
AntonK '18年

4

我认为正确的答案是一种--no-parent选择:

   -np
   --no-parent
       Do not ever ascend to the parent directory when retrieving recursively.
       This is a useful option, since it guarantees that only the files below
       a certain hierarchy will be downloaded.

该标志与OP想要的标志完全相反
EkriirkE

1

也许我想念一些东西,但是如果那是你想要的,那

wget -c -np -r www.foo.com/bar1/bar2

为我工作(使用您的示例)。当然,使用这些选项,您还将获得www.foo.com从上到下的所有目录结构。如果您只想bar2顶级,那就去

wget -c -np -r -nH --cut-dirs=1 www.foo.com/bar1/bar2

-nH摆脱的www.foo.com,并--cut-dirs=1摆脱的bar1,所以你会得到bar2和它的子目录下载到当前目录。有关更多信息,请参见man wget,它具有很多可读性并提供了示例。


您省略了起点,必须遵循链接。您假设起点同时位于顶层(这是的琐碎情况np),但是当顶层高于起点时,我正在寻找一般解决方案。
greenoldman

@macias:对不起,我没有关注您。你能举个例子说明吗?
Faheem Mitha

我刚刚添加了ASCII“截屏”。我希望这将有所帮助。在此示例中,A是起点。
greenoldman 2011年

@macias:因此,您不想指定路径B(按照您的示例),而是A?如果是这样,为什么?这是因为您要自动化某些脚本还是出于某些其他原因?我也不确定X = 2表示什么。那是2级吗?如果你想获取的目录树中的进一步下跌,我不知道你是如何区分BG
Faheem Mitha

A是起点,因为它是起点-看,我在客户端,而不是服务器。IOW-我拥有服务器,也没有建立此结构。我必须处理我所看到的。X是更新2中的符号,“深度”可以增加多少级。你给G区分B,因为B是B,G是不是B,你看到B,因为它是A. URL的一部分,我改写的问题在更新4
greenoldman
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.