wget com curingas em downloads http

45

Eu preciso baixar um arquivo usando o wget, mas 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 desligar e ligar globbing quando se lida com um site FTP, no entanto eu tenho uma url http.

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

Coisas que eu tentei.

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

Atualizar

Usar o -A faz com que todos os arquivos terminados em .tar.gz no servidor sejam baixados.

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

Atualizar

Das respostas, esta é a sintaxe que eventualmente funcionou.

/usr/local/bin/wget -r -l1 -np "https://foo" -P /tmp -A "bar*.tar.gz"
    
por spuder 03.03.2014 / 22:06

3 respostas

54

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/
    
por 03.03.2014 / 22:46
14

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

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

Isso é significativo, porque se você quiser aplicar um glob on, tudo o que é um subpath de http://foo/bar/ , a menos que o servidor forneça algum mecanismo para fornecê-lo (por exemplo, o índice mencionado), não há nada a aplicar é o glob para . Não existe um sistema de arquivos para pesquisar. Por exemplo, só porque você sabe que há páginas http://foo/bar/one.html e http://foo/bar/two.html nã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-lhe uma bela imagem jpg. Etc.

Portanto, não há nenhum padrão aqui que wget possa explorar. AFAICT, wget trabalha para espelhar uma hierarquia de caminho ativamente examinando links em cada página . Em outras palavras, se você espelhar recursivamente http://foo/bar/index.html , ele baixará index.html e, em seguida, extrairá links que são um subcaminho disso. 2 A opção -A é simplesmente um filtro aplicado nesse processo .

Em suma, se você sabe que esses arquivos estão indexados em algum lugar, você pode começar com isso usando -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 em sua natureza, pode ser de uma forma que permita globbing transparente.

2. Isso significa que pode haver um URL válido http://foo/bar/alt/whatever/stuff/ que não será incluído porque não está vinculado a nada no conjunto de itens vinculado a 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 do conteúdo transparente, nem precisam fazê-lo de maneira intuitivamente óbvia.

    
por 03.03.2014 / 22:46
0

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

  1. wget da página
  2. grep para o padrão
  3. wget do (s) arquivo (s)

Exemplo: suponha que seja uma página de podcast de notícias e eu quero 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 grep está procurando por links sem espaço entre aspas duplas que contenham :// e meu nome de arquivo pattern .

    
por 24.02.2018 / 02:42

Tags