Есть ли способ отключить 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по умолчанию воссоздает структуру сервера, здесь нечего бояться или нет необходимости что-либо исправлять. Итак, в двух словах - как обычно.

Обновление 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.

ВАЖНЫЕ ВАРИАНТЫ www.foo.com/B/C/A/A.html

Вопрос в том, какие есть варианты получить все страницы из каталога B и ниже (зная, что вам нужно начинать с A.html).

greenoldman
источник
Вы хотите получить, bar2но нет bar1? Где bar2будет жить? Что, если у двух или более папок, которые вы не хотите, есть поддиректории с одинаковыми именами, их содержимое должно быть объединено? Почти наверняка проще просто взять весь этот чертов сайт и затем обрезать / переместить вещи по своему желанию.
Килиан Фот
@Kilian Foth, что ты имеешь в виду под "получить весь проклятый сайт"? Получение это? В целом, это излишне, это может означать получение ТБ, когда нужны МБ. В остальном см. Update2.
Гринольдман
Не уверен, что вы имеете в виду. Единственная интерпретация, которую я могу придумать, это то, что вы хотите bar2каталог и все его содержимое. Если это не так, пожалуйста, уточните.
Фахим Митха
@Faheem Mitha, "его содержание" = "все поддерево". Да, я верю только в эту интерпретацию, и именно это я и имею в виду.
Гринольдман

Ответы:

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.
AProgrammer
источник
4

Вам нужно добавить окончательный / к URL, иначе вы не получите то, что вы хотите.

Если вы хотите получить весь контент по адресу www.myhostname.com/somedirectory, то синтаксис должен выглядеть следующим образом:

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

Попробуй без конца / и посмотри что получится. Затем попробуйте с помощью /.

Адриан
источник
1
Он все равно поднимется в более высокие каталоги, если ссылки на них будут ссылаться на него
EkriirkE
Большое спасибо за подсказку с косой чертой! Это помогло мне решить проблему с несоответствующими файлами, извлеченными wget из соседних каталогов (братьев и сестер).
АнтонК
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.
Джонатон Рейнхарт
источник
Этот флаг является полной противоположностью того, что хочет ОП
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), но я ищу общее решение, когда верхний уровень находится выше начальной точки.
Гринольдман
@macias: Извините, я не слежу за вами. Можете проиллюстрировать примером?
Фахим Митха
Я только что добавил ASCII "скриншот". Я надеюсь, это поможет. В этом примере A является отправной точкой.
Гринольдман
@macias: То есть вы не хотите указывать путь B(согласно вашему примеру), а скорее A? Если так, то почему? Это потому, что вы хотите автоматизировать какой-то скрипт или по какой-то другой причине? Я также не уверен, что вы подразумеваете под Х = 2. Означает ли это уровень 2? Если вы пытаетесь получить каталоги дальше вниз по дереву, я не уверен, как вы отличаетесь Bот них G.
Фахим Митха
А является отправной точкой, потому что это отправная точка - посмотрите, я на стороне клиента, а не сервера. IOW - я НЕ владею сервером, и я не создал эту структуру. Мне приходится иметь дело с тем, что я вижу. X - это символ из Обновления 2, «глубина», на сколько уровней вы можете подняться. Вы отличаете B от G, потому что B - это B, а G - это не B, и вы видите B, потому что это часть URL для A. Я перефразировал вопрос в обновлении 4.
greenoldman