wget com curingas em downloads http

53

Preciso fazer o download de um arquivo usando o wget, no entanto, não sei exatamente qual será o nome do arquivo.

https://foo/bar.1234.tar.gz

De acordo com a página de manual , o wget permite que você ative e desista quando estiver lidando com um site ftp, no entanto, eu tenho um URL http.

Como posso usar um curinga enquanto uso um wget? Estou usando o gnu wget.

Coisas que eu tentei.

/usr/local/bin/wget -r "https://foo/bar.*.tar.gz" -P /tmp

Atualizar

O uso de -A faz com que todos os arquivos que terminem em .tar.gz no servidor sejam baixados.

/usr/local/bin/wget -r "https://foo/" -P /tmp -A "bar.*.tar.gz"

Atualizar

A partir das respostas, esta é a sintaxe que acabou por funcionar.

/usr/local/bin/wget -r -l1 -np "https://foo" -P /tmp -A "bar*.tar.gz"
spuder
fonte
2
Isso não é exatamente o que você está procurando, mas está relacionado: O Curl tem a capacidade de usar curingas básicos, por exemplo:curl "http://example.com/picture[1-10].jpg" -o "picture#1.jpg"
Hello World
11
Uma pegadinha para mim foi o -e robots=offparâmetro para não robots.txt obedecer: stackoverflow.com/a/11124664/1097104
Juuso Ohtonen
Eu encontrei adicionando as bandeiras -nHe --cut-dirs=<number>também foi útil
Randall

Respostas:

62

Eu acho que essas opções farão o que você quiser com wget:

   -A acclist --accept acclist
   -R rejlist --reject rejlist
       Specify comma-separated lists of file name suffixes or patterns to 
       accept or reject. Note that if any of the wildcard characters, *, ?,
       [ or ], appear in an element of acclist or rejlist, it will be 
       treated as a pattern, rather than a suffix.

   --accept-regex urlregex
   --reject-regex urlregex
       Specify a regular expression to accept or reject the complete URL.

Exemplo

$ wget -r --no-parent -A 'bar.*.tar.gz' http://url/dir/
slm
fonte
15

Há uma boa razão para que isso não funcione diretamente com HTTP, e isso significa que um URL não é um caminho de arquivo, embora o uso de /como delimitador possa parecer um, e às vezes eles correspondem. 1

Convencionalmente (ou historicamente), os servidores da Web geralmente refletem hierarquias de diretório (para alguns - por exemplo, Apache - isso é uma espécie de integral) e até fornecem índices de diretório como um sistema de arquivos. No entanto, nada sobre o protocolo HTTP exige isso.

Isto é importante, porque se você deseja aplicar um glob em dizer, tudo o que é um subpath de http://foo/bar/, a menos que o servidor fornece algum mecanismo para fornecê-lo com tal (por exemplo, o índice acima referido), não há nada para aplicá-lo a glob para . Não existe um sistema de arquivos para pesquisar. Por exemplo, apenas porque você sabe que existem páginas http://foo/bar/one.htmle http://foo/bar/two.htmlnão significa que você pode obter uma lista de arquivos e subdiretórios via http://foo/bar/. Seria completamente dentro do protocolo para o servidor retornar 404 para isso. Ou poderia retornar uma lista de arquivos. Ou pode enviar uma boa imagem jpg. Etc.

Portanto, não há um padrão aqui que wgetpossa ser explorado. AFAICT, o wget trabalha para espelhar uma hierarquia de caminhos examinando ativamente os links em cada página . Em outras palavras, se você espelha recursivamente, http://foo/bar/index.htmlele baixa index.htmle extrai links que são um subcaminho disso. 2 O -Aswitch é simplesmente um filtro aplicado nesse processo.

Em resumo, se você souber que esses arquivos estão indexados em algum lugar, você pode começar usando isso -A. Se não, então você está sem sorte.


1. É claro que um URL de FTP também é um URL. No entanto, embora eu não saiba muito sobre o protocolo FTP, acho que, com base na natureza, ele pode ter uma forma que permita globbing transparente.

2. Isso significa que pode haver uma URL válida http://foo/bar/alt/whatever/stuff/que não será incluída porque não está de forma alguma vinculada a nada no conjunto de itens vinculados http://foo/bar/index.html. Ao contrário dos sistemas de arquivos, os servidores da Web não são obrigados a tornar o layout de seu conteúdo transparente, nem precisam fazê-lo de uma maneira intuitivamente óbvia.

Cachinhos Dourados
fonte
0

A solução '-A pattern' acima pode não funcionar com algumas páginas da web. Esta é minha solução alternativa, com um duplo wget:

  1. wget a página
  2. grep para padrão
  3. wget os arquivos)

Exemplo: suponha que seja uma página de podcast de notícias e que eu queira 5 arquivos mp3 no topo da página:

wget -nv -O- https://example/page/ |
 grep -o '[^"[:space:]]*://[^"[:space:]]*pattern[^"[:space:]]*\.mp3' |
  head -n5 | while read x; do
    sleep $(($RANDOM % 5 + 5))  ## to appear gentle and polite
    wget -nv "$x"
  done

O grepestá procurando por links sem espaço com aspas duplas que contenham ://e meu nome de arquivo pattern.

turno da noite
fonte
o que é ALEATÓRIO aqui?
royki 2/01
Uma variável shell, consulte a bashpágina de manual. RANDOM Cada vez que esse parâmetro é referenciado, um número inteiro aleatório entre 0 e 32767 é gerado.
nighthift