Czy istnieje sposób, aby uniemożliwić wget pobieranie plików z katalogów nadrzędnych na określoną głębokość?

11

wget ma taką opcję, -npktóra uniemożliwia pobieranie plików z dowolnego katalogu nadrzędnego. Potrzebuję czegoś podobnego, ale nieco bardziej elastycznego. Rozważać:

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

Chciałbym uzyskać wszystko, ale nie „wyżej” (w hierarchii drzew) niż bar2(!). Dlatego bar2też należy je pobrać, ale nie należy bar1.

Czy istnieje sposób na uczynienie wget bardziej selektywnym?

Tło: Próbuję wykonać kopię lustrzaną witryny o podobnej logicznej strukturze - punkt początkowy, potem w górę, a następnie w dół. Jeśli istnieje inne narzędzie wget, lepiej dostosowane do takiego układu, daj mi również znać.

Aktualizacja

Lub zamiast określania możliwej głębokości, może coś w stylu „bez rodziców, chyba że pasują do tego lub tego adresu URL”.

Aktualizacja 2

Na serwerze jest jakaś struktura, prawda? Możesz to wyobrazić jako drzewo. Zwykle z „--no-parent” zaczynasz od punktu A i schodzisz tylko w dół.

Moim życzeniem jest zdolność do wznoszenia się - wyrażona przez powiedzenie, że dozwolone jest wchodzenie do węzłów X, lub (co jest w 100% równoważne), że wolno jechać do węzła B (gdzie odległość BA = X).

We wszystkich przypadkach zasady zejścia na dół pozostają określone przez użytkowników (na przykład - zejście tylko o poziomy Y).

Jak go przechowywać? W rzeczywistości tak naprawdę nie jest to pytanie - wgetdomyślnie odtwarza strukturę serwera, nie ma się czego bać lub nie trzeba niczego naprawiać. Tak więc, w dwóch słowach - jak zwykle.

Aktualizacja 3

Struktura katalogów poniżej - załóżmy, że w każdym katalogu jest tylko jeden plik, w R - R.html i tak dalej. Jest to oczywiście uproszczone, ponieważ możesz mieć więcej niż jedną stronę.

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

Punktem początkowym jest A (A.html), X = 2 (więc B jest węzłem najwyższego poziomu, który chciałbym pobrać) W tym konkretnym przykładzie oznacza to pobranie wszystkich stron oprócz R.html i G.html. A.html nazywany jest „punktem wyjścia”, bo trzeba zacząć od niego, a nie z B.

Aktualizacja 4

Nazewnictwo jest używane z aktualizacji 3.

wget OPCJE www.foo.com/B/C/A/A.html

Pytanie brzmi, jakie są opcje, aby uzyskać wszystkie strony z katalogu B i poniżej (wiedząc, że musisz zacząć od A.html).

Greenoldman
źródło
Chcesz bar2zostać ściągnięty, ale nie bar1? Gdzie bar2będzie mieszkać? Co się stanie, jeśli dwa lub więcej katalogów, których nie chcesz, mają podkatalogi o identycznych nazwach, czy ich zawartość powinna zostać scalona? Prawie na pewno łatwiej jest po prostu zdobyć całą tę cholerną stronę, a następnie przycinać / przenosić rzeczy, jak chcesz.
Kilian Foth,
@Kilian Foth, co rozumiesz przez „cholerna strona”? Pobieranie? Zasadniczo jest to przesada, może oznaczać pobieranie TB, gdy potrzebne są MB. Reszta - patrz aktualizacja 2.
greenoldman
Nie wiem co masz na myśli. Jedyną interpretacją, jaką mogę wymyślić, jest to, że chcesz bar2katalog i całą jego zawartość. Jeśli to nie to, proszę wyjaśnić.
Faheem Mitha
@Faheem Mitha, „its content” = „całe poddrzewo”. Tak, wierzę, że to tylko interpretacja i właśnie o to mi chodzi.
greenoldman

Odpowiedzi:

12

Nie próbowałem tego, ale użycie -I i -X może dać ci to, czego chcesz. Moje pierwsze próby byłyby podobne

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

Objaśnienie opcji:

-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
źródło
4

Musisz dodać końcowy / do adresu URL, inaczej nie dostaniesz tego, czego chcesz.

Jeśli chcesz uzyskać całą zawartość na www.myhostname.com/somedirectory, składnia powinna brzmieć następująco:

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

Wypróbuj bez końca / i zobacz, co się stanie. Następnie spróbuj z /.

Adrian
źródło
1
Nadal będzie się
wspinać
Wielkie dzięki za podpowiedź z końcowym ukośnikiem! Pomogło mi to rozwiązać problem z nieistotnymi plikami pobieranymi przez wget z sąsiednich katalogów (rodzeństwo).
AntonK
4

Myślę, że właściwą odpowiedzią jest --no-parentopcja:

   -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.
Jonathon Reinhart
źródło
Ta flaga jest dokładnym przeciwieństwem tego, czego chce OP
EkriirkE
1

Może czegoś mi brakuje, ale jeśli tego właśnie chcesz

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

działa dla mnie (na twoim przykładzie). Oczywiście dzięki tym opcjom uzyskasz całą strukturę katalogów powyżej, od początku do końca www.foo.com. Jeśli chcesz tylko bar2na najwyższym poziomie, to zrób

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

-nHpozbywa się www.foo.comi --cut-dirs=1pozbywa bar1, więc bar2pobierzesz i jego podkatalogi pobrane do bieżącego katalogu. Aby uzyskać więcej informacji, zobacz man wget, który jest dość czytelny i zawiera przykłady.

Faheem Mitha
źródło
Ci pominiętymi punkt wyjścia, to trzeba się linki. Zakładałeś, że punkt początkowy jest jednocześnie najwyższym poziomem (jest to trywialny przypadek np), ale szukam ogólnego rozwiązania, gdy najwyższy poziom znajduje się powyżej punktu początkowego.
greenoldman,
@macias: Przepraszam, nie śledzę cię. Czy możesz to zilustrować przykładem?
Faheem Mitha
Właśnie dodałem „zrzut ekranu” ASCII. Mam nadzieję, że to pomoże. W tym przykładzie A jest punktem początkowym.
greenoldman
@macias: Więc nie chcesz określać ścieżki B(jak w twoim przykładzie), ale raczej A? Jeśli tak, to dlaczego? Czy to dlatego, że chcesz zautomatyzować jakiś skrypt lub z innego powodu? Nie jestem również pewien, co masz na myśli przez X = 2. Czy to oznacza poziom 2? Jeśli próbujesz pobrać katalogi niżej w drzewie, nie jestem pewien, jak można odróżnić Bod G.
Faheem Mitha
A jest punktem wyjścia, ponieważ jest punktem wyjścia - spójrz, jestem po stronie klienta, a nie serwera. IOW - NIE posiadam serwera i nie stworzyłem tej struktury. Mam do czynienia z tym, co widzę. X jest symbolem z aktualizacji 2, „głębokości”, o ile poziomów można przejść w górę. Rozróżniasz B od G, ponieważ B jest B, a G nie jest B, i widzisz B, ponieważ jest to część adresu URL dla A. Przesunęłem to pytanie w aktualizacji 4.
greenoldman,