Utilizzo di wget per recuperare ricorsivamente una directory con file arbitrari al suo interno


573

Ho una directory web in cui memorizzo alcuni file di configurazione. Vorrei usare wget per rimuovere quei file e mantenerne la struttura attuale. Ad esempio, la directory remota appare come:

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

.vim contiene più file e directory. Voglio replicarlo sul client usando wget. Non riesco a trovare la giusta combinazione di flag wget per farlo. Qualche idea?

Risposte:


988

Devi passare l' opzione -np/ --no-parenta wget(oltre a -r/ --recursive, ovviamente), altrimenti seguirà il link nell'indice di directory sul mio sito alla directory principale. Quindi il comando sarebbe simile al seguente:

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

Per evitare di scaricare i index.htmlfile generati automaticamente , utilizzare l' opzione -R/ --reject:

wget -r -np -R "index.html*" http://example.com/configs/.vim/

52
aggiungi -nH (taglia il nome host) --cut-dirs = X (taglia le directory X). è un po 'fastidioso dover contare manualmente le directory per X ..
lkraav l'

3
Perché nessuno di questi funziona con w3.org/History/1991-WWW-NeXT/Implementation ? Scarica solo robots.txt
matteo

31
@matteo perché il robots.txt probabilmente non consente la scansione del sito Web. Dovresti aggiungere -e robot = off per forzare la scansione.
gaborous

aggiungi -X / absolute / path / to / cartella per escludere una particolare directory
vishnu narayanan

3
Se non si desidera scaricare l'intero contenuto, è possibile utilizzare: -l1 basta scaricare la directory (esempio.com nel proprio caso) -l2 scaricare la directory e tutte le sottocartelle di livello 1 ('esempio.com/something' ma non 'example.com/somthing/foo') E così via. Se non si inserisce alcuna opzione -l, wget utilizzerà automaticamente -l 5. Se inserisci un -l 0 scaricherai l'intera Internet, perché wget seguirà tutti i collegamenti che trova. stackoverflow.com/a/19695143/6785908
so-random-dude

123

Per scaricare una directory in modo ricorsivo, che rifiuta i file index.html * e i download senza il nome host, la directory principale e l'intera struttura della directory:

wget -r -nH --cut-dirs=2 --no-parent --reject="index.html*" http://mysite.com/dir1/dir2/data

Non riesco a farlo funzionare: wget -r -nH --cut-dirs = 3 --no-parent --reject = "index.html *" w3.org/History/1991-WWW-NeXT/Implementation - -cut-dirs = 2 non funziona neanche Scarica solo robots.txt che si trova nella cartella principale. Cosa mi manca?
matteo,

34
@matteo prova ad aggiungere: -e robot = off
Paul J

Per ottenere ricorsivamente tutte le directory all'interno di una directory, utilizzare wget -r -nH --reject = "index.html *" mysite.io:1234/dir1/dir2
Prasanth Ganesan

115

Per chiunque altro che abbia problemi simili. Segue Wget robots.txtche potrebbe non permetterti di accedere al sito. Non preoccuparti, puoi disattivarlo:

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

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


Quando ignori robots.txt dovresti almeno limitare le tue richieste. Il comportamento suggerito in questa risposta è altamente scortese.
Nessuno il

@Nobody Allora, qual è la cortese risposta a questo?
Phani Rithvij,

@PhaniRithvij Rate limita le tue richieste, wget ha dei parametri per questo. Nota che alcune persone potrebbero ancora avere problemi, e considerando che il file dei robot ti dice esplicitamente che non è consentito fare ciò che stai facendo, potresti anche avere problemi legali.
Nessuno il

37

Dovresti usare il flag -m (mirror), poiché si occupa di non confondere con i timestamp e di ricorrere indefinitamente.

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

Se aggiungi i punti menzionati da altri in questa discussione, sarebbe:

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

35

Ecco il comando wget completo che ha funzionato per me per scaricare i file dalla directory di un server (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/

8

Se --no-parentnon aiuta, potresti usare--include opzione.

Directory directory:

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

E vuoi scaricare downloads/goodma non downloads/baddirectory:

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

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

per me va bene.

Forse hai un .wgetrc che interferisce con esso?


5

Per recuperare una directory in modo ricorsivo con nome utente e password, utilizzare il comando seguente:

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

2

Wget 1.18 potrebbe funzionare meglio, ad esempio, sono stato morso da un bug versione 1.12 in cui ...

wget --recursive (...)

... recupera solo index.html invece di tutti i file.

Per ovviare al problema, è stato possibile notare circa 301 reindirizzamenti e provare la nuova posizione: dato il nuovo URL, wget ha ottenuto tutti i file nella directory.


2

Tutto ciò che serve sono due flag, uno è "-r"per la ricorsione e "--no-parent"(o -np) per non andare in '.'e ".." . Come questo:

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

Questo è tutto. Verrà scaricato nella seguente albero locale: ./example.com/configs/.vim. Tuttavia, se non si desidera le prime due directory, utilizzare il flag aggiuntivo --cut-dirs=2come suggerito nelle risposte precedenti:

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

E scaricherà il tuo albero dei file solo in ./.vim/

In effetti, ho ottenuto la prima riga da questa risposta proprio dal manuale di wget , hanno un esempio molto chiaro verso la fine della sezione 4.3.


2

La seguente opzione sembra essere la combinazione perfetta quando si tratta di download ricorsivi:

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

Snippet pertinenti dalle pagine man per comodità:

   -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.

1

Dovresti essere in grado di farlo semplicemente aggiungendo un -r

wget -r http://stackoverflow.com/

9
Questo in realtà non scarica una directory, ma tutti i file che può trovare sul server, comprese le directory sopra quella che si desidera scaricare.
Luc,

1

Questa versione viene scaricata in modo ricorsivo e non crea directory principali.

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. Aggiungi ~/.bashrco incolla nel terminale
  2. wgetod "http://example.com/x/"
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.