Wget'in ana dizinlerden belirli derinliğe dosya almasını devre dışı bırakmanın bir yolu var mı?


11

wget , -npherhangi bir üst dizinden dosya almayı devre dışı bırakan bir seçeneğe sahiptir . Benzer ama biraz daha esnek bir şeye ihtiyacım var. Düşünmek:

www.foo.com/bar1/bar2/bar3/index.html

Ben her şeyi almak istiyorum ama bar2(!) Göre daha yüksek değil (ağaç hiyerarşisinde ). Bu yüzden bar2getirilmelidir ama olmamalıdır bar1.

Wget'i daha seçici yapmanın bir yolu var mı?

Arka plan: Benzer bir mantıksal yapıya sahip bir web sitesini yansıtmaya çalışıyorum - başlangıç ​​noktası, sonra yukarı, sonra aşağı. wgetBöyle bir düzen için daha uygun başka bir araç varsa , lütfen bana da bildirin.

Güncelleme

Veya olası derinliği belirtmek yerine, "bu URL veya bu URL ile eşleşmedikleri sürece ebeveyn yok" gibi bir şey olabilir.

Güncelleme 2

Sunucuda bazı yapılar var, değil mi? Bir ağaç olarak görselleştirebilirsiniz. Normalde "--no-parent" ile A noktasından başlayıp sadece aşağı inersiniz.

Benim dileğim, yukarı çıkma yeteneğidir - X düğümlerine çıkmasına izin verildiğini veya (% 100 eşdeğeri) B düğümüne (BA = X mesafesi) gitmesine izin verildiğini söyleyerek ifade edilir.

Her durumda, kullanıcılar tarafından tanımlandığı şekilde aşağı inmeye ilişkin kurallar kalır (örneğin, yalnızca Y düzeylerine iner).

Nasıl saklanır? Aslında asıl soru bu değil - wgetvarsayılan olarak sunucu yapısını yeniden oluşturur, burada korkacak bir şey yoktur veya herhangi bir şeyi düzeltmeye gerek yoktur. Yani, 2 kelimeyle - her zamanki gibi.

Güncelleme 3

Aşağıdaki dizin yapısı - varsayalım ki her dizinde R - R.html ve içinde sadece bir dosya vardır. Birden fazla sayfanız olabileceğinden, bu elbette basitleştirilmiştir.

        R 
       / \
      B   G
     / \
    C   F
   / \
  A   D
 /
E 

A (A.html) başlangıç ​​noktam, X = 2'dir (bu nedenle B almak istediğim en üst düzey düğümdür). Bu özel örnekte bu, R.html ve G.html dışındaki tüm sayfaların getirilmesi anlamına gelir. A.html'ye "başlangıç ​​noktası" denir, çünkü B'den değil, ondan başlamak zorundayım .

Güncelleme 4

Adlandırma Güncelleme 3'te kullanılır.

wget SEÇENEKLERİ www.foo.com/B/C/A/A.html

Soru, tüm sayfaları B dizininden ve altından almak için seçenekler nelerdir (A.html'den başlamanız gerektiğini bilerek).


bar2Getirilmek istiyorsun ama değil bar1mi? Nerede bar2ikamet edecek? İstemediğiniz iki veya daha fazla dizin aynı adlı alt dizinlere sahipse, içerikleri birleştirilmelidir? Sadece tüm lanet siteyi almak ve sonra istediğiniz gibi budamak / hareket ettirmek neredeyse kesinlikle daha kolaydır.
Kilian Foth

@Kilian Foth, "Bütün siteyi al" derken ne demek istiyorsun? Getiriliyor mu? Genel olarak aşırıdır, MB'ler gerektiğinde TB'lerin getirilmesi anlamına gelebilir. Geri kalanı için bkz. Update2.
greenoldman

Ne demek istediğinden emin değilim. Gelebileceğim tek yorum, bar2dizini ve tüm içeriğini istediğiniz . Değilse, lütfen açıklığa kavuşturun.
Faheem Mitha

@Faheem Mitha, "içeriği" = "tüm alt ağaç". Evet, bu sadece inandığım yorum ve tam olarak bunu kastediyorum.
greenoldman

Yanıtlar:


12

Denemedim, ama -I ve -X kullanmak size istediğinizi verebilir. İlk denemelerim

wget -m -I bar1/bar2 -X "*" http://www.foo.com/bar1/bar2/bar3/index.html

Seçeneklerin açıklaması:

-m: 
   --mirror
       Turn on options suitable for mirroring.  This option turns on recursion and time-stamping, sets
       infinite recursion depth and keeps FTP directory listings.  It is currently equivalent to -r -N -l
       inf --no-remove-listing.
-I: list
   --include-directories=list
       Specify a comma-separated list of directories you wish to follow when downloading.  Elements of
       list may contain wildcards.
-X: list
   --exclude-directories=list
       Specify a comma-separated list of directories you wish to exclude from download.  Elements of list
       may contain wildcards.

4

URL'ye bir final / eklemeniz gerekir, aksi takdirde istediğinizi elde edemezsiniz.

Tüm içeriği www.myhostname.com/somedirectory adresinden almak istiyorsanız , sözdizimi aşağıdaki gibi olmalıdır:

wget -r -nH http://www.myhostname.com/somedirectory/

Sonu olmadan deneyin / ve ne olduğunu görün. Sonra / ile deneyin.


1
Bununla bağlantılı sayfalar buna atıfta bulunursa daha yüksek dizinlere yükselecektir
EkriirkE

Sondaki eğik çizgi ile ipucu için çok teşekkürler! Komşu dizinlerden (kardeşler) wget tarafından getirilen alakasız dosyalarla sorunu çözmeme yardımcı oldu.
AntonK

4

Bence burada doğru cevap --no-parentseçenek:

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

Bu bayrak OP'nin istediklerinin tam tersidir
EkriirkE

1

Belki bir şey eksik, ama eğer istediğin buysa

wget -c -np -r www.foo.com/bar1/bar2

benim için çalışıyor (örneğini kullanarak). Tabii ki, bu seçeneklerle tüm dizin yapısını da www.foo.comaşağıdan alacaksınız . Sadece bar2üst seviyede istiyorsanız ,

wget -c -np -r -nH --cut-dirs=1 www.foo.com/bar1/bar2

-nHkurtulur www.foo.comve --cut-dirs=1kurtulur bar1, böylece alırsınız bar2ve alt dizinleri geçerli dizine indirilir. Daha fazla bilgi için, man wgetoldukça okunabilir ve örneklere bakın.


Başlangıç ​​noktasını atladınız , bağlantıları takip etmeniz gerekiyor . Başlangıç ​​noktasının aynı zamanda üst düzey olduğunu varsaydınız (bu önemsiz bir durumdur np), ancak üst düzey başlangıç ​​noktasının üstünde olduğunda genel bir çözüm arıyorum.
greenoldman

@macias: Üzgünüm, seni takip etmiyorum. Bir örnekle açıklayabilir misiniz?
Faheem Mitha

Az önce bir ASCII "ekran görüntüsü" ekledim. Umarım bu yardımcı olacak. Bu örnekte A başlangıç ​​noktasıdır.
greenoldman

@macias: Yani B(örneğinize göre) yolunu belirtmek istemiyorsunuz , aksine A? Öyleyse neden? Bu, bir komut dosyasını otomatikleştirmek istediğiniz veya başka bir nedenden dolayı mı? X = 2 ile ne demek istediğinizden de emin değilim. Bu seviye 2 demek mi? Eğer daha da aşağı ağacında dizinleri almaya çalışıyorsanız, ben emin ayırt nasıl değilim Bdan G.
Faheem Mitha

A başlangıç ​​noktasıdır, çünkü başlangıç ​​noktasıdır - bak, istemci tarafındayım, sunucu değil. IOW - Ben sunucunun sahibi DEĞİLDİR ve bu yapıyı yapmadım. Gördüklerimle ilgilenmeliyim. X , Güncelleme 2'nin sembolüdür, kaç seviye yükseltebileceğiniz "derinlik". B'yi G'den ayırırsınız, çünkü B B'dir ve G B değildir ve B'yi görürsünüz, çünkü A URL'sinin bir parçasıdır. 4. Güncellemede soruyu yeniden
yazdım
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.