2008-11-07 15 views
421

Mam katalog stron, w którym przechowuję niektóre pliki konfiguracyjne. Chciałbym użyć wget, aby usunąć te pliki i zachować ich aktualną strukturę. Na przykład zdalny katalog wygląda następująco:Używanie wget do rekurencyjnego pobierania katalogu z dowolnymi plikami w nim

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

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

Odpowiedz

727

trzeba przejść opcję -np/--no-parent do wget (oprócz -r/--recursive, oczywiście), w przeciwnym razie będzie podążaj za odnośnikiem w indeksie katalogów w mojej witrynie do katalogu nadrzędnego. Tak więc polecenie będzie wyglądać następująco:

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

Aby uniknąć pobierania automatycznie wygenerowane index.html plików, należy wybrać opcję -R/--reject:

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

add -nH (wycina nazwę hosta) --cut-dirs = X (wycina katalogi X). Trochę irytujące jest ręczne liczenie katalogów dla X .. – lkraav

+1

Dlaczego żaden z nich nie działa na http://www.w3.org/History/1991-WWW-NeXT/Implementation/? To będzie pobierać plik robots.txt – matteo

+18

@matteo, ponieważ plik robots.txt prawdopodobnie nie pozwala zaindeksować witryny. Powinieneś dodać -e roboty = wyłączone, aby wymusić indeksowanie. – gaborous

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

działa dla mnie.

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

0

Powinieneś być w stanie to zrobić po prostu przez dodanie -r

wget -r http://stackoverflow.com/ 
+8

To naprawdę nie pobiera katalogu, ale wszystkie pliki, które może znaleźć na serwerze, w tym katalogi nad tym, które chcesz pobrać. – Luc

103

Aby pobrać katalog rekursywnie, który odrzuca index.html * pliki 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 
+0

Nie mogę tego uruchomić: wget -r -nH --cut-dirs = 3 --no-parent --reject = "index.html * "http://www.w3.org/History/1991-WWW-NeXT/Implementation/ - cut-dirs = 2 nie działa ani Powoduje pobranie tylko pliku robots.txt, który faktycznie znajduje się w folderze głównym. Whet ja mi brakuje? – matteo

+26

@matteo spróbuj dodać: -e roboty = wyłączone – paulj

26

Oto pełna polecenia wget, który pracował dla mnie, aby pobrać pliki z katalogu serwera (pomijając 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/ 
4

Jeśli --no-parent nie pomóż, możesz użyć opcji --include.

katalog struct:

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

I chcesz pobrać downloads/good ale nie downloads/bad katalogu:

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

Należy użyć flagi -m (lustro), jako że zajmuje się nie bałagan z sygnaturami czasowymi i powtarzającymi się w nieskończoność.

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

Jeśli dodać punkty wymienione przez innych w tym wątku, to byłoby:

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

Aby pobrać katalog rekurencyjnie z nazwy użytkownika i hasła, należy użyć następującego polecenia:

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

Wget 1.18 może działać lepiej, np. Zostałem ugryziony przez wersję 1.12 błędu, gdzie ...

wget --recursive (...) 

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

Obejście polegało na zauważeniu niektórych przekierowań 301 i wypróbowaniu nowej lokalizacji - biorąc pod uwagę nowy adres URL, wget dostał wszystkie pliki w katalogu.

0

Ta wersja pobiera pliki 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" 
} 

Zastosowanie:

  1. Dodaj do ~/.bashrc lub wkleić do terminala
  2. wgetod "http://example.com/x/"
0

Wszystko czego potrzebujesz to dwie flagi, jedna jest "-r" dla rekursji i "--no-parent" (lub -np) aby nie wchodzić w ustawienia '.' i "..". Tak:

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

To wszystko. Zostanie pobrany do następującego lokalnego drzewa: ./example.com/configs/.vim. Jednak jeśli nie chcesz pierwszych dwóch katalogów, a następnie użyć dodatkowych flagę --cut-dirs=2 jako sugerowane we wcześniejszych odpowiedziach:

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

I będzie pobierać drzewo plików tylko do ./.vim/

w rzeczywistości, Dostałem pierwszą linię od tej odpowiedzi dokładnie od wget manual, jest to bardzo czysty przykład na końcu sekcji 4.3.