Existe uma maneira de desativar o wget de obter arquivos dos diretórios pai para uma profundidade específica?

11

O wget possui uma opção -npque desativa a obtenção de arquivos de qualquer diretório pai. Eu preciso de algo semelhante, mas um pouco mais flexível. Considerar:

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

Eu gostaria de obter tudo, mas não "mais alto" (na hierarquia da árvore) que bar2(!). Portanto bar2, também deve ser buscado, mas não bar1.

Existe uma maneira de tornar o wget mais seletivo?

Antecedentes: estou tentando espelhar um site, com uma estrutura lógica semelhante - ponto de partida, depois para cima e para baixo. Se houver outra ferramenta wgetmais adequada para esse layout, informe-me também.

Atualizar

Ou, em vez de especificar uma possível profundidade, talvez algo como "sem pais, a menos que correspondam a esse ou aquele URL".

Atualização 2

Existe alguma estrutura no servidor, certo? Você pode visualizá-lo como uma árvore. Então normalmente com "--no-parent" você começa a partir de algum ponto A e desce apenas.

Meu desejo é a capacidade de subir - expressa por dizer: é permitido subir nós X, ou (o que é 100% equivalente) que seja permitido subir no nó B (onde a distância BA = X).

Em todos os casos, as regras para diminuir permanecem como foram definidas pelos usuários (por exemplo - diminuem apenas pelos níveis Y).

Como guardar? Na verdade, não é realmente a questão - wgetpor padrão, recria a estrutura do servidor, não há nada a temer aqui ou não há necessidade de consertar nada. Então, em 2 palavras - como sempre.

Atualização 3

Estrutura de diretório abaixo - vamos assumir que em cada diretório existe apenas um arquivo, em R - R.html e assim por diante. Isso é simplificado, é claro, porque você pode ter mais de uma página.

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

A (A.html) é meu ponto de partida, X = 2 (então B é o nó de nível superior que eu gostaria de buscar). Neste exemplo em particular, isso significa buscar todas as páginas, exceto R.html e G.html. A.html é chamado "ponto de partida" porque eu tenho que começar com ele, não com B.

Atualização 4

A nomeação é usada na Atualização 3.

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

A questão é quais são as opções para obter todas as páginas do diretório B e abaixo (sabendo que é necessário iniciar a partir do A.html).

greenoldman
fonte
Você quer bar2buscar, mas não bar1? Onde bar2vai morar? E se dois ou mais diretórios que você não deseja possuem subdirets com nome idêntico, o conteúdo deles deve ser mesclado? É quase certamente mais fácil obter todo o maldito site e depois podar / mover as coisas como você deseja.
Kilian Foth
@Kilian Foth, o que você quer dizer com "obter todo o site maldito"? Buscando? Em geral, é um exagero, pode significar buscar TBs quando MBs são necessários. Para o resto, consulte atualização2.
greenoldman
Não tenho certeza do que você quer dizer. A única interpretação que posso apresentar é: você deseja o bar2diretório e todo o seu conteúdo. Caso contrário, esclareça.
Faheem Mitha
@Faheem Mitha, "seu conteúdo" = "subárvore inteira". Sim, acredito que seja apenas a interpretação, e é exatamente isso que quero dizer.
greenoldman

Respostas:

12

Eu não tentei, mas usar -I e -X pode dar o que você deseja. Minhas primeiras tentativas seriam na linha de

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

Explicação das opções:

-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
fonte
4

Você precisa adicionar um final / ao URL, caso contrário não conseguirá o que deseja.

Se você deseja obter todo o conteúdo em www.myhostname.com/somedirectory , a sintaxe deve ser como:

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

Experimente sem o fim / e veja o que acontece. Em seguida, tente com o /.

Adrian
fonte
11
Ele ainda vai subir em diretórios superiores se páginas com links nele se referir a tal
EkriirkE
Muito obrigado pela dica com barra final! Isso me ajudou a resolver o problema com arquivos irrelevantes buscados pelo wget em diretórios vizinhos (irmãos).
AntonK
4

Eu acho que a resposta certa aqui é a --no-parentopção:

   -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
fonte
Esta bandeira é o exato oposto do que OP quer
EkriirkE
1

Talvez esteja faltando alguma coisa, mas se é isso que você quer, então

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

funciona para mim (usando o seu exemplo). Obviamente, com essas opções, você também terá toda a estrutura de diretórios acima, de www.foo.combaixo para cima. Se você quer apenas bar2no nível superior, faça

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

-nHse livrar do www.foo.com, e --cut-dirs=1se livrar bar1, para que você obtenha bar2e seus subdiretórios baixados no diretório atual. Para mais informações, consulte man wget, que é bastante legível e tem exemplos.

Faheem Mitha
fonte
Você omitiu o ponto de partida, precisa seguir os links. Você assumiu que o ponto de partida é ao mesmo tempo de nível superior (esse é um caso trivial np), mas estou procurando uma solução geral, quando o nível de topo está acima do ponto de partida.
greenoldman
@macias: Desculpe, não estou te seguindo. Você pode ilustrar com um exemplo?
Faheem Mitha
Acabei de adicionar uma "captura de tela" ASCII. Espero que isso ajude. Neste exemplo, A é o ponto de partida.
greenoldman
@macias: Então você não deseja especificar o caminho para B(como no seu exemplo), mas sim A? Se sim, por quê? Isso ocorre porque você deseja automatizar algum script ou por algum outro motivo? Também não tenho certeza do que você quer dizer com X = 2. Isso significa nível 2? Se você está tentando buscar diretórios ainda mais para baixo na árvore, eu não sei como você distinguir Bentre G.
Faheem Mitha
A é o ponto de partida, porque é o ponto de partida - olha, eu estou do lado do cliente, não um servidor. IOW - NÃO possuo o servidor e não fiz essa estrutura. Eu tenho que lidar com o que vejo. X é o símbolo da Atualização 2, a "profundidade" de quantos níveis você pode subir. Você distinguir B de G, porque B é B, e G não é B, e você vê B, porque é parte da URL para A. I reformulou a pergunta no Update 4.
greenoldman