Używanie wget do rekurencyjnego pobierania katalogu zawierającego dowolne pliki

573

Mam katalog internetowy, w którym przechowuję niektóre pliki konfiguracyjne. Chciałbym użyć wget do ściągnięcia tych plików i utrzymania ich obecnej struktury. Na przykład katalog zdalny wygląda następująco:

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

.vim przechowuje wiele plików i katalogów. Chcę powielić to na kliencie za pomocą wget. Nie można znaleźć odpowiedniej kombinacji flag wget, aby to zrobić. Jakieś pomysły?

jerodsanto
źródło

Odpowiedzi:

986

Musisz przekazać opcję -np/ --no-parentdo wget(oprócz -r/ --recursiveoczywiście), w przeciwnym razie będzie ona podążać za linkiem w indeksie katalogu na mojej stronie do katalogu nadrzędnego. Polecenie wyglądałoby więc tak:

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

Aby uniknąć pobierania automatycznie generowanych index.htmlplików, użyj opcji -R/ --reject:

wget -r -np -R "index.html*" http://example.com/configs/.vim/
Jeremy Ruten
źródło
52
dodaj -nH (wycina nazwę hosta) --cut-dirs = X (wycina katalogi X). to trochę denerwujące, że trzeba ręcznie liczyć katalogi dla X ..
lkraav,
3
Dlaczego żadna z tych funkcji nie działa w przypadku w3.org/History/1991-WWW-NeXT/Implementation ? Będzie pobierał tylko plik robots.txt
matteo,
31
@matteo, ponieważ plik robots.txt prawdopodobnie nie zezwala na indeksowanie witryny. Należy dodać -e robots = off, aby wymusić indeksowanie.
gaborous
dodaj -X / absolutorium / ścieżka / do / folderu, aby wykluczyć określony katalog
Wisznu Narayanan
3
Jeśli nie chcesz pobierać całej zawartości, możesz użyć: -l1 po prostu pobierz katalog (example.com w twoim przypadku) -l2 pobierz katalog i wszystkie podfoldery poziomu 1 („example.com/something”, ale nie „example.com/somthing/foo”) I tak dalej. Jeśli wstawisz opcję -l, wget automatycznie użyje -l 5. Jeśli wstawisz -l 0, pobierzesz cały Internet, ponieważ wget będzie podążał za każdym znalezionym linkiem. stackoverflow.com/a/19695143/6785908
so-random-dude
123

Aby pobrać katalog rekurencyjnie, który odrzuca pliki index.html * i pliki do pobrania bez nazwy hosta, katalogu nadrzędnego i całej struktury katalogów:

wget -r -nH --cut-dirs=2 --no-parent --reject="index.html*" http://mysite.com/dir1/dir2/data
Sriram
źródło
Nie mogę tego uruchomić: wget -r -nH --cut-dirs = 3 --no-parent --reject = "index.html *" w3.org/History/1991-WWW-NeXT/Implementation - -cut-dirs = 2 nie działa albo Pobiera tylko plik robots.txt, który faktycznie znajduje się w folderze głównym. Czy ja tęsknię?
matteo,
34
@matteo spróbuj dodać: -e roboty = wyłączone
Paul J
Aby rekurencyjnie uzyskać wszystkie katalogi w katalogu, użyj wget -r -nH --reject = "index.html *" mysite.io:1234/dir1/dir2
Prasanth Ganesan
115

Dla każdego, kto ma podobne problemy. Wget śledzi, robots.txtco może nie pozwolić ci pobrać strony. Nie martw się, możesz to wyłączyć:

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

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

Sean Villani
źródło
Gdy ignorujesz plik robots.txt, powinieneś przynajmniej ograniczyć swoje żądania. Zachowanie sugerowane w tej odpowiedzi jest bardzo niegrzeczne.
Nikt
@ Nikt Więc jaka jest grzeczna odpowiedź na to?
Phani Rithvij
@PhaniRithvij Oceń ogranicz swoje żądania, wget ma dla niego parametry. Pamiętaj, że niektóre osoby mogą nadal mieć problem, a biorąc pod uwagę, że plik robotów wyraźnie mówi ci, że nie możesz robić tego, co obecnie robisz, możesz nawet wpaść w kłopoty prawne.
Nikt
37

Powinieneś użyć flagi -m (mirror), ponieważ pozwala to nie zadzierać ze znacznikami czasu i powtarza się w nieskończoność.

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

Jeśli dodasz punkty wspomniane przez innych w tym wątku, będzie to:

wget -m -e robots=off --no-parent http://example.com/configs/.vim/
SamGoody
źródło
34

Oto kompletne polecenie wget, które zadziałało dla mnie, aby pobrać pliki z katalogu serwera (ignorowanie 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
źródło
8

Jeśli --no-parentnie pomoże, możesz użyć --includeopcji.

Struktura katalogu:

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

I chcesz pobrać, downloads/goodale nie downloads/badkatalog:

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

źródło
5
wget -r http://mysite.com/configs/.vim/

pracuje dla mnie.

Być może masz plik .wgetrc, który go zakłóca?

Conor McDermottroe
źródło
5

Aby rekurencyjnie pobrać katalog z nazwą użytkownika i hasłem, użyj następującego polecenia:

wget -r --user=(put username here) --password='(put password here)' --no-parent http://example.com/
prayagupd
źródło
2

Wget 1.18 może działać lepiej, np. Ugryzł mnie błąd wersji 1.12, w którym ...

wget --recursive (...)

... pobiera tylko index.html zamiast wszystkich plików.

Obejściem problemu było zauważenie około 301 przekierowań i wypróbowanie nowej lokalizacji - biorąc pod uwagę nowy adres URL, wget ma wszystkie pliki w katalogu.

Devon
źródło
2

Wszystko czego potrzebujesz to dwie flagi, jedna służy "-r"do rekurencji i "--no-parent"(lub -np), aby nie wchodzić w '.'i ".." . Lubię to:

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

Otóż ​​to. Będzie pobrać pod następującym lokalnego drzewa: ./example.com/configs/.vim. Jeśli jednak nie chcesz pierwszych dwóch katalogów, użyj dodatkowej flagi, --cut-dirs=2jak sugerowano we wcześniejszych odpowiedziach:

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

I pobierze twoje drzewo plików tylko do ./.vim/

W rzeczywistości pierwszy wiersz otrzymałem od tej odpowiedzi dokładnie z instrukcji wget , mają bardzo czysty przykład pod koniec sekcji 4.3.

Jordan Gee
źródło
2

Następująca opcja wydaje się być idealną kombinacją w przypadku pobierania rekurencyjnego:

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

Odpowiednie fragmenty stron podręcznika dla wygody:

   -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
źródło
1

Powinieneś być w stanie to zrobić po prostu dodając -r

wget -r http://stackoverflow.com/
kasperjj
źródło
9
Tak naprawdę nie pobiera katalogu, ale wszystkie pliki, które może znaleźć na serwerze, w tym katalogi powyżej tego, który chcesz pobrać.
Luc
1

Ta wersja pobiera rekurencyjnie i nie tworzy katalogów nadrzędnych.

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"
}

Stosowanie:

  1. Dodaj ~/.bashrclub wklej do terminala
  2. wgetod "http://example.com/x/"
Bangkok
źródło