Чи є спосіб відключити 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.

wget ВАРІАНТИ www.foo.com/B/C/A/A.html

Питання полягає в тому, які варіанти отримати всі сторінки з каталогу B і нижче (знаючи, що ви повинні почати з A.html).


Ви хочете bar2отримати, але ні bar1? Де bar2збирається проживати? Що робити, якщо два або більше dir, які ви не хочете, мають однакові підкаталоги, слід об'єднати їх вміст? Майже напевно простіше просто дістати цілий проклятий сайт, а потім обрізати / перемістити речі за бажанням.
Кіліан Фот

@Kilian Foth, що ти маєш на увазі під "отримати цілий проклятий сайт"? Виймаєте його? Загалом це надмірність, це може означати отримання туберкульозу, коли потрібні МБ. Для решти див. Update2.
greenoldman

Не впевнений, що ти маєш на увазі. Єдине тлумачення, яке я можу придумати, - це те, щоб ви хотіли, щоб bar2каталог і весь його вміст. Якщо це не так, уточнюйте, будь ласка.
Faheem Mitha

@Faheem Mitha, "його зміст" = "ціле піддерево". Так, я вважаю, що це лише інтерпретація, і саме це я маю на увазі.
greenoldman

Відповіді:


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

Дуже дякую за підказку з кінцевою косою рисою! Це допомогло мені вирішити проблему з невідповідними файлами, отриманими wget із сусідніх каталогів (братів і сестер).
AntonK

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), але я шукаю загальне рішення, коли верхній рівень вище вихідного.
greenoldman

@macias: Вибачте, я не слідкую за вами. Чи можете ви проілюструвати на прикладі?
Faheem Mitha

Я щойно додав ASCII "скріншот". Сподіваюся, це допоможе. У цьому прикладі A є вихідною точкою.
greenoldman

@macias: Отже, ви не хочете вказувати шлях до B(за вашим прикладом), а скоріше A? Якщо так, то чому? Це тому, що ви хочете автоматизувати якийсь сценарій або з якоїсь іншої причини? Я також не впевнений, що ви маєте на увазі під X = 2. Це означає рівень 2? Якщо ви намагаєтеся витягти каталоги далі вниз в дереві, я не знаю , як ви відрізнити Bвід G.
Faheem Mitha

A - це відправна точка, тому що це вихідна точка - дивіться, я на стороні клієнта, а не на сервері. IOW - я не володію сервером, і я не створив цю структуру. Я маю справу з тим, що бачу. X - символ оновлення 2, "глибина", на скільки рівнів можна піднятися вгору. Ви відрізняєте B від G, тому що B - B, а G - не B, і ви бачите B, оскільки це частина URL-адреси для А. Я перефразував це запитання в Оновлення 4.
greenoldman
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.