Usando o wget para buscar recursivamente um diretório com arquivos arbitrários nele

573

Eu tenho um diretório da web onde guardo alguns arquivos de configuração. Eu gostaria de usar o wget para baixar esses arquivos e manter sua estrutura atual. Por exemplo, o diretório remoto se parece com:

http://mysite.com/configs/.vim/

.vim contém vários arquivos e diretórios. Eu quero replicar isso no cliente usando o wget. Não consigo encontrar a combinação certa de sinalizadores wget para fazer isso. Alguma ideia?

jerodsanto
fonte

Respostas:

988

Você deve passar a opção -np/ --no-parentpara wget(além de -r/ --recursive, é claro), caso contrário, seguirá o link no índice do diretório no meu site para o diretório pai. Portanto, o comando ficaria assim:

wget --recursive --no-parent http://example.com/configs/.vim/

Para evitar o download dos index.htmlarquivos gerados automaticamente , use a opção -R/ --reject:

wget -r -np -R "index.html*" http://example.com/configs/.vim/
Jeremy Ruten
fonte
52
adicione -nH (corta o nome do host) --cut-dirs = X (corta os diretórios X). que é um pouco chato ter que contar manualmente diretórios para X ..
lkraav
3
Por que nenhum desses funciona para w3.org/History/1991-WWW-NeXT/Implementation ? Ele só vai baixar robots.txt
Matteo
31
@matteo porque o robots.txt provavelmente não permite o rastreamento do site. Você deve adicionar -e robots = off para forçar o rastreamento.
gaborous
adicionar -X / / caminho absoluto / to / pasta para excluir um diretório específico
Vishnu Narayanan
3
Se você não deseja fazer o download de todo o conteúdo, use: -l1 faça o download do diretório (exemplo.com no seu caso) -l2 faça o download do diretório e de todas as subpastas de nível 1 ('exemplo.com/algo', mas não 'example.com/somthing/foo') E assim por diante. Se você inserir a opção no -l, o wget usará -l 5 automaticamente. Se você inserir um -l 0, fará o download de toda a Internet, porque o wget seguirá todos os links encontrados. stackoverflow.com/a/19695143/6785908
so-random-dude
123

Para baixar um diretório recursivamente, o que rejeita arquivos e downloads index.html * sem o nome do host, o diretório pai e toda a estrutura de diretórios:

wget -r -nH --cut-dirs=2 --no-parent --reject="index.html*" http://mysite.com/dir1/dir2/data
Sriram
fonte
Não consigo fazer isso funcionar: wget -r -nH --cut-dirs = 3 --no-parent --reject = "index.html *" w3.org/History/1991-WWW-NeXT/Implementation - -cut-dirs = 2 também não funciona Ele baixa o robots.txt, que na verdade está na pasta raiz. De quem estou sentindo falta?
Matteo
34
@matteo tente adicionar: robôs -e = off
Paul J
Para obter recursivamente todos os diretórios dentro de um diretório, use wget -r -nH --reject = "index.html *" mysite.io:1234/dir1/dir2
Prasanth Ganesan
115

Para qualquer pessoa que tenha problemas semelhantes. O Wget segue, o robots.txtque pode não permitir que você acesse o site. Não se preocupe, você pode desativá-lo:

wget -e robots=off http://www.example.com/

http://www.gnu.org/software/wget/manual/html_node/Robot-Exclusion.html

Sean Villani
fonte
Ao ignorar o robots.txt, você deve pelo menos limitar suas solicitações. O comportamento sugerido nesta resposta é altamente indelicado.
Ninguém
@ Ninguém Então, qual é a resposta educada para isso?
Phani Rithvij
@PhaniRithvij Rate limite seus pedidos, o wget possui parâmetros para isso. Observe que algumas pessoas ainda podem ter problemas e, considerando que o arquivo de robôs está explicitamente informando que não é permitido fazer o que você está fazendo no momento, você pode até ter problemas legais.
Ninguém
37

Você deve usar o sinalizador -m (espelho), pois isso cuida de não mexer com os carimbos de data e hora e se repetir indefinidamente.

wget -m http://example.com/configs/.vim/

Se você adicionar os pontos mencionados por outras pessoas neste segmento, seria:

wget -m -e robots=off --no-parent http://example.com/configs/.vim/
SamGoody
fonte
35

Aqui está o comando wget completo que funcionou para mim para baixar arquivos do diretório de um servidor (ignorando robots.txt):

wget -e robots=off --cut-dirs=3 --user-agent=Mozilla/5.0 --reject="index.html*" --no-parent --recursive --relative --level=1 --no-directories http://www.example.com/archive/example/5.3.0/
Erich Eichinger
fonte
8

Se --no-parentnão ajudar, você pode usar a --includeopção

Estrutura do diretório:

http://<host>/downloads/good
http://<host>/downloads/bad

E você deseja fazer o download, downloads/goodmas não o downloads/baddiretório:

wget --include downloads/good --mirror --execute robots=off --no-host-directories --cut-dirs=1 --reject="index.html*" --continue http://<host>/downloads/good

fonte
5
wget -r http://mysite.com/configs/.vim/

funciona para mim.

Talvez você tenha um .wgetrc que esteja interferindo nele?

Conor McDermottroe
fonte
5

Para buscar um diretório recursivamente com nome de usuário e senha, use o seguinte comando:

wget -r --user=(put username here) --password='(put password here)' --no-parent http://example.com/
prayagupd
fonte
2

O Wget 1.18 pode funcionar melhor, por exemplo, fui mordido por um bug da versão 1.12, onde ...

wget --recursive (...)

... recupera apenas index.html em vez de todos os arquivos.

A solução foi observar cerca de 301 redirecionamentos e tentar o novo local - dada a nova URL, o wget obteve todos os arquivos no diretório.

Devon
fonte
2

Tudo que você precisa é de dois sinalizadores, um é "-r"para recursão e "--no-parent"(ou -np) para não entrar no '.'e ".." . Como isso:

wget -r --no-parent http://example.com/configs/.vim/

É isso aí. Ele irá baixar na árvore local seguinte: ./example.com/configs/.vim. No entanto, se você não desejar os dois primeiros diretórios, use o sinalizador adicional, --cut-dirs=2conforme sugerido nas respostas anteriores:

wget -r --no-parent --cut-dirs=2 http://example.com/configs/.vim/

E ele fará o download da sua árvore de arquivos apenas no ./.vim/

De fato, obtive a primeira linha desta resposta precisamente no manual wget , eles têm um exemplo muito claro no final da seção 4.3.

Jordan Gee
fonte
2

A opção a seguir parece ser a combinação perfeita ao lidar com o download recursivo:

wget -nd -np -P / dest / dir --recursivo http: // url / dir1 / dir2

Trechos relevantes das páginas de manual por conveniência:

   -nd
   --no-directories
       Do not create a hierarchy of directories when retrieving recursively.  With this option turned on, all files will get saved to the current directory, without clobbering (if a name shows up more than once, the
       filenames will get extensions .n).


   -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.
pr-pal
fonte
1

Você poderá fazê-lo simplesmente adicionando -r

wget -r http://stackoverflow.com/
kasperjj
fonte
9
Isso realmente não faz o download de um diretório, mas todos os arquivos que ele pode encontrar no servidor, incluindo os diretórios acima daquele que você deseja baixar.
Luc
1

Esta versão é baixada recursivamente e não cria diretórios pai.

wgetod() {
    NSLASH="$(echo "$1" | perl -pe 's|.*://[^/]+(.*?)/?$|\1|' | grep -o / | wc -l)"
    NCUT=$((NSLASH > 0 ? NSLASH-1 : 0))
    wget -r -nH --user-agent=Mozilla/5.0 --cut-dirs=$NCUT --no-parent --reject="index.html*" "$1"
}

Uso:

  1. Adicionar ~/.bashrcou colar no terminal
  2. wgetod "http://example.com/x/"
rkok
fonte