Apakah ada cara untuk menonaktifkan wget dari mendapatkan file dari direktori induk ke kedalaman tertentu?

11

wget memiliki opsi untuk -npmenonaktifkan file dari direktori induk mana pun. Saya membutuhkan sesuatu yang serupa tetapi sedikit lebih fleksibel. Mempertimbangkan:

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

Saya ingin mendapatkan segalanya tetapi tidak "lebih tinggi" (dalam hierarki pohon) daripada bar2(!). Jadi bar2juga harus diambil tetapi tidak bar1.

Apakah ada cara untuk membuat wget lebih selektif?

Latar Belakang: Saya mencoba membuat mirror situs web, dengan struktur logis yang serupa - titik awal, lalu naik, lalu turun. Jika ada alat lain selain wget, lebih cocok untuk tata letak seperti itu, beri tahu saya juga.

Memperbarui

Atau alih-alih menentukan kedalaman yang mungkin, mungkin sesuatu seperti "tidak ada orang tua, kecuali mereka cocok dengan URL ini atau itu".

Perbarui 2

Ada beberapa struktur di server, bukan? Anda dapat memvisualisasikannya sebagai pohon. Jadi biasanya dengan "--tidak ada orang tua" Anda mulai dari beberapa titik A dan hanya turun.

Harapan saya, adalah kemampuan untuk naik - diekspresikan dengan mengatakan, diizinkan naik ke X node, atau (yang setara 100%) sehingga diizinkan naik ke B node (di mana jarak BA = X).

Dalam semua kasus, aturan untuk turun tetap seperti yang ditentukan oleh pengguna (misalnya - turun hanya berdasarkan level Y).

Bagaimana cara menyimpannya? Sebenarnya itu bukan pertanyaan yang sebenarnya - wgetsecara default membuat ulang struktur server, tidak ada yang perlu ditakutkan, atau tidak perlu untuk memperbaiki apa pun. Jadi, dalam 2 kata - seperti biasa.

Perbarui 3

Struktur direktori di bawah ini - mari kita asumsikan bahwa dalam setiap direktori hanya ada satu file, dalam R - R.html dan seterusnya. Ini tentu saja disederhanakan karena Anda dapat memiliki lebih dari satu halaman.

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

A (A.html) adalah titik awal saya, X = 2 (jadi B adalah simpul level paling atas yang ingin saya ambil). Dalam contoh khusus ini berarti mengambil semua halaman kecuali R.html dan G.html. A.html disebut "titik awal" karena saya harus memulainya, bukan dari B.

Perbarui 4

Penamaan digunakan dari Pembaruan 3.

wget OPSI www.foo.com/B/C/A/A.html

Pertanyaannya adalah apa saja pilihan untuk mendapatkan semua halaman dari direktori B dan di bawah (mengetahui bahwa Anda harus mulai dari A.html).

Greenoldman
sumber
Anda ingin bar2mengambil tetapi tidak bar1? Di mana bar2akan tinggal? Bagaimana jika dua atau lebih dir yang tidak Anda inginkan memiliki subdirama bernama identik, haruskah kontennya digabungkan? Ini hampir pasti lebih mudah untuk hanya mendapatkan seluruh situs sialan dan kemudian memangkas / memindahkan hal-hal di sekitar yang Anda inginkan.
Kilian Foth
@Kilian Foth, Apa yang Anda maksud dengan "dapatkan seluruh situs sialan"? Mengambilnya? Secara umum itu berlebihan, itu bisa berarti mengambil TB ketika MB dibutuhkan. Untuk selebihnya, lihat pembaruan2.
greenoldman
Tidak yakin apa yang kamu maksud. Satu-satunya interprestasi yang dapat saya lakukan adalah, Anda menginginkan bar2direktori dan semua isinya. Jika bukan itu, mohon klarifikasi.
Faheem Mitha
@Faheem Mitha, "kontennya" = "seluruh subtree". Ya, ini hanya interpretasi yang saya yakini, dan itulah yang saya maksudkan.
greenoldman

Jawaban:

12

Saya belum mencobanya, tetapi menggunakan -I dan -X dapat memberikan apa yang Anda inginkan. Percobaan pertama saya adalah di sepanjang garis

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

Penjelasan opsi:

-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.
Pemrogram
sumber
4

Anda perlu menambahkan final / ke URL, kalau tidak Anda tidak akan mendapatkan yang Anda inginkan.

Jika Anda ingin mendapatkan semua konten di www.myhostname.com/somedirectory maka sintaks seharusnya berbunyi seperti:

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

Cobalah tanpa akhir / dan lihat apa yang terjadi. Kemudian coba dengan /.

Adrian
sumber
1
Itu masih akan naik ke direktori yang lebih tinggi jika halaman-halaman yang terhubung di dalamnya merujuk pada hal seperti itu
EkriirkE
Terima kasih banyak untuk petunjuknya dengan trailing slash! Ini membantu saya untuk menyelesaikan masalah dengan file yang tidak relevan yang diambil oleh wget dari direktori tetangga (saudara kandung).
AntonK
4

Saya pikir jawaban yang tepat di sini adalah --no-parentpilihan:

   -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.
Jonathon Reinhart
sumber
Bendera ini adalah kebalikan dari apa yang diinginkan OP
EkriirkE
1

Mungkin saya kehilangan sesuatu, tetapi jika itu yang Anda inginkan maka

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

bekerja untuk saya (menggunakan contoh Anda). Tentu saja, dengan opsi-opsi itu Anda akan mendapatkan semua struktur direktori di atas itu juga, dari www.foo.comatas ke bawah. Jika Anda hanya ingin bar2di tingkat atas, maka lakukanlah

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

-nHmenyingkirkan www.foo.com, dan --cut-dirs=1menghilangkan bar1, sehingga Anda akan mendapatkan bar2dan subdirektori yang diunduh ke direktori saat ini. Untuk informasi lebih lanjut, lihat man wget, yang cukup mudah dibaca dan memiliki contoh.

Faheem Mitha
sumber
Anda menghilangkan titik awal, Anda harus mengikuti tautan. Anda berasumsi bahwa titik awal berada pada tingkat atas yang sama (ini adalah kasus sepele np), tetapi saya mencari solusi umum, ketika tingkat atas berada di atas titik awal.
greenoldman
@ Macias: Maaf, saya tidak mengikuti Anda. Bisakah Anda memberi ilustrasi dengan sebuah contoh?
Faheem Mitha
Saya baru saja menambahkan "tangkapan layar" ASCII. Saya harap ini akan membantu. Dalam contoh ini A adalah titik awal.
greenoldman
@ Macias: Jadi Anda tidak ingin menentukan path ke B(sesuai contoh Anda), melainkan A? Jika demikian, mengapa? Apakah ini karena Anda ingin mengotomatiskan beberapa skrip atau karena alasan lain? Saya juga tidak yakin apa yang Anda maksud dengan X = 2. Apakah itu berarti level 2? Jika Anda mencoba untuk mengambil direktori lebih bawah di pohon, aku tidak yakin bagaimana Anda membedakan Bdari G.
Faheem Mitha
A adalah titik awal, karena merupakan titik awal - lihat, saya di sisi klien, bukan server. TKI - Saya TIDAK memiliki server, dan saya tidak membuat struktur ini. Saya harus berurusan dengan apa yang saya lihat. X adalah simbol dari Pembaruan 2, "kedalaman" berapa level yang bisa Anda naiki. Anda membedakan B dari G, karena B adalah B, dan G bukan B, dan Anda melihat B, karena itu adalah bagian dari URL untuk A. Saya mengulangi pertanyaan di Pembaruan 4.
greenoldman