İçinde rastgele dosyalar bulunan bir dizini yinelemeli olarak almak için wget kullanma


573

Bazı yapılandırma dosyalarını sakladığım bir web dizinim var. Bu dosyaları aşağı çekmek ve mevcut yapısını korumak için wget kullanmak istiyorum. Örneğin, uzak dizin şöyle görünür:

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

.vim birden çok dosya ve dizini barındırır. Bunu wget kullanarak istemcide çoğaltmak istiyorum. Bunu yapmak için doğru bayrak kombinasyonunu bulamıyorum. Herhangi bir fikir?

Yanıtlar:


988

Sen geçmek zorunda -np/ --no-parentseçeneği wget(ilaveten -r/ --recursive, tabii ki), aksi takdirde üst dizine sitemde dizin endeksinde bağlantıyı takip edecek. Yani komut şöyle görünecektir:

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

Otomatik oluşturulan index.htmldosyaları indirmekten kaçınmak için -R/ --rejectseçeneğini kullanın:

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

52
add -nH (ana bilgisayar adını keser) --cut-dirs = X (X dizinlerini keser). X için dizinleri manuel olarak saymak zorunda biraz sinir bozucu ..
lkraav

3
Bunlardan hiçbiri w3.org/History/1991-WWW-NeXT/Implementation için neden çalışmıyor ? Sadece robots.txt indirecek
matteo

31
@matteo çünkü robots.txt büyük olasılıkla web sitesini taramaya izin vermiyor. Taramayı zorlamak için -e robots = off eklemeniz gerekir.
gaborous

Belirli bir dizini hariç tutmak için -X / mutlak / yol / / / klasörünü ekleyin
vishnu narayanan

3
İçeriğin tamamını indirmek istemiyorsanız şunları kullanabilirsiniz: -l1 dizini indirin (sizin durumunuzda example.com) -l2 dizini ve tüm düzey 1 alt klasörlerini indirin ('example.com/something' ama değil 'example.com/somthing/foo') vb. -L seçeneği eklemezseniz, wget otomatik olarak -l 5 kullanır. Eğer bir -l 0 eklerseniz tüm interneti indirirsiniz çünkü wget bulduğu her bağlantıyı takip eder. stackoverflow.com/a/19695143/6785908
so-random-dude

123

İndex.html * dosyalarını reddeden ve ana makine adı, üst dizin ve tüm dizin yapısı olmadan indirilen bir dizini özyinelemeli olarak indirmek için:

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

Bunu çalıştıramıyorum: wget -r -nH --cut-dirs = 3 --no-parent --reject = "index.html *" w3.org/History/1991-WWW-NeXT/Implementation - -cut-dirs = 2 de çalışmaz Sadece kök klasöründe bulunan robots.txt dosyasını indirir. Neyi özlüyorum?
matteo

34
@matteo eklemeyi deneyin: -e robots = off
Paul J

Bir dizindeki tüm dizinleri özyinelemeli olarak edinmek için, wget -r -nH --reject = "index.html *" sitem.io:1234/dir1/dir2
Prasanth Ganesan

115

Benzer sorunları olan herkes için. robots.txtSiteyi almanıza izin vermeyebilecek Wget takip ediyor. Endişelenmeyin, kapatabilirsiniz:

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

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


Robots.txt dosyasını yok sayarken en azından isteklerinizi azaltmanız gerekir. Bu cevapta önerilen davranış oldukça kaba.
Kimse

@ Kimse Peki buna kibar cevap nedir?
Phani Rithvij

@PhaniRithvij Oran isteklerinizi sınırlandırır, wget bunun için parametrelere sahiptir. Bazı kişilerin hala sorun yaşayabileceğini ve robot dosyasının açık bir şekilde şu anda yaptığınız şeyi yapmanıza izin verilmediğini söylediği düşünüldüğünde, yasal sorun yaşayabilirsiniz.
Kimse

37

-M (ayna) bayrağını kullanmalısınız, çünkü bu zaman damgalarıyla uğraşmamaya ve süresiz olarak geri çekilmeye özen gösterir.

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

Bu başlıkta başkaları tarafından belirtilen noktaları eklerseniz, şöyle olur:

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

34

Bir sunucunun dizininden dosya indirmeme yarayan tam wget komutu (yoksayılıyor 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

Eğer --no-parentyardım etmezseniz, --includeseçeneği kullanabilirsiniz .

Dizin yapısı:

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

Ve indirmek istiyorsunuz downloads/goodama downloads/baddizini değil :

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/

benim için çalışıyor.

Belki de ona müdahale eden bir .wgetrc var?


5

Kullanıcı adı ve parolayla bir dizini tekrar tekrar almak için aşağıdaki komutu kullanın:

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

2

Wget 1.18 daha iyi çalışabilir, örneğin, bir sürüm 1.12 hata tarafından ısırıldı var ...

wget --recursive (...)

... tüm dosyalar yerine yalnızca index.html dosyasını alır.

Geçici çözüm, bazı 301 yönlendirmelerini fark etmek ve yeni konumu denemekti - yeni URL göz önüne alındığında, wget dizindeki tüm dosyaları aldı.


2

Tek ihtiyacınız biridir iki bayrak olan "-r"özyineleme ve için "--no-parent"(veya -npgitmek değil sırayla) '.'ve ".." . Bunun gibi:

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

Bu kadar. Aşağıdaki yerel ağaca indirir: ./example.com/configs/.vim. Ancak, ilk iki dizini istemiyorsanız, --cut-dirs=2önceki yanıtlarda önerilen ek bayrağı kullanın :

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

Ve dosya ağacınızı yalnızca ./.vim/

Aslında, bu cevaptan ilk satırı tam olarak wget kılavuzundan aldım, bölüm 4.3'ün sonuna doğru çok temiz bir örneği var.


2

Aşağıdaki seçenek, özyinelemeli indirme ile uğraşırken mükemmel bir kombinasyon gibi görünüyor:

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

Kolaylık sağlamak için man sayfalarındaki alakalı snippet'ler:

   -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

Bunu sadece -r ekleyerek yapabilmeniz gerekir.

wget -r http://stackoverflow.com/

9
Bu gerçekten bir dizin indirmez, ancak indirmek istediğiniz dizinin üzerindeki dizinler de dahil olmak üzere sunucuda bulabileceği tüm dosyaları indirir.
Luc

1

Bu sürüm özyinelemeli olarak indirilir ve üst dizin oluşturmaz.

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

Kullanımı:

  1. ~/.bashrcTerminale ekleyin veya terminale yapıştırın
  2. wgetod "http://example.com/x/"
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.