Menggunakan wget untuk secara rekursif mengambil direktori dengan file sewenang-wenang di dalamnya

573

Saya memiliki direktori web tempat saya menyimpan beberapa file konfigurasi. Saya ingin menggunakan wget untuk menarik file-file itu ke bawah dan mempertahankan struktur mereka saat ini. Misalnya, direktori jarak jauh terlihat seperti:

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

.vim menampung banyak file dan direktori. Saya ingin meniru itu pada klien menggunakan wget. Tampaknya tidak dapat menemukan kombo yang tepat dari bendera wget untuk menyelesaikan ini. Ada ide?

jerodsanto
sumber

Jawaban:

988

Anda harus meneruskan opsi -np/ --no-parentke wget(selain -r/ --recursive, tentu saja), jika tidak maka akan mengikuti tautan dalam indeks direktori di situs saya ke direktori induk. Jadi perintahnya akan terlihat seperti ini:

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

Untuk menghindari mengunduh index.htmlfile yang dibuat secara otomatis , gunakan opsi -R/ --reject:

wget -r -np -R "index.html*" http://example.com/configs/.vim/
Jeremy Ruten
sumber
52
add -nH (memotong hostname) --cut-dirs = X (memotong direktori X). ini agak menjengkelkan karena harus secara manual menghitung direktori untuk X ..
lkraav
3
Mengapa semua ini tidak berhasil di w3.org/History/1991-WWW-NeXT/Implementation ? Itu hanya akan mengunduh robots.txt
matteo
31
@matteo karena robots.txt mungkin melarang perayapan situs web. Anda harus menambahkan -e robot = off untuk memaksa perayapan.
Gaborous
tambahkan -X / absolute / path / ke / folder untuk mengecualikan direktori tertentu
vishnu narayanan
3
Jika Anda tidak ingin mengunduh seluruh konten, Anda dapat menggunakan: -l1 cukup unduh direktori (example.com dalam kasus Anda) -l2 unduh direktori dan semua subfolder level 1 ('example.com/something' tetapi tidak 'example.com/somthing/foo') Dan seterusnya. Jika Anda memasukkan opsi no-l, wget akan menggunakan -l 5 secara otomatis. Jika Anda memasukkan -l 0 Anda akan mengunduh seluruh Internet, karena wget akan mengikuti setiap tautan yang ditemukannya. stackoverflow.com/a/19695143/6785908
so-random-dude
123

Untuk mengunduh direktori secara rekursif, yang menolak file index.html * dan unduhan tanpa nama host, direktori induk dan seluruh struktur direktori:

wget -r -nH --cut-dirs=2 --no-parent --reject="index.html*" http://mysite.com/dir1/dir2/data
Sriram
sumber
Saya tidak bisa menjalankan ini: wget -r -nH --cut-dirs = 3 --no-parent --reject = "index.html *" w3.org/History/1991-WWW-NeXT/Implementation - -cut-dirs = 2 tidak berfungsi. Itu hanya mengunduh robots.txt yang sebenarnya ada di folder root. Apa saya hilang?
matteo
34
@matteo coba tambahkan: -e robot = tidak aktif
Paul J
Untuk secara rekursif mendapatkan semua direktori dalam direktori, gunakan wget -r -nH --reject = "index.html *" mysite.io:1234/dir1/dir2
Prasanth Ganesan
115

Untuk siapa pun yang memiliki masalah serupa. Wget mengikuti robots.txtyang mungkin tidak memungkinkan Anda untuk mengambil situs tersebut. Jangan khawatir, Anda dapat mematikannya:

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

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

Sean Villani
sumber
Saat Anda mengabaikan robots.txt, Anda setidaknya harus membatasi permintaan Anda. Perilaku yang disarankan dalam jawaban ini sangat tidak sopan.
Tidak seorang pun
@ Tidak Ada Jadi apa jawaban sopan untuk ini?
Phani Rithvij
@PhaniRithvij Nilai membatasi permintaan Anda, wget memiliki parameter untuk itu. Perhatikan bahwa beberapa orang mungkin masih mengambil masalah, dan mengingat file robot secara eksplisit memberi tahu Anda bahwa itu tidak diizinkan untuk melakukan apa yang sedang Anda lakukan, Anda bahkan mungkin mendapat masalah hukum.
Tidak ada yang
37

Anda harus menggunakan flag -m (mirror), karena berhati-hati untuk tidak mengacaukan stempel waktu dan untuk berulang tanpa batas.

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

Jika Anda menambahkan poin yang disebutkan oleh orang lain di utas ini, itu akan menjadi:

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

Inilah perintah lengkap wget yang berfungsi untuk saya mengunduh file dari direktori server (mengabaikan 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
sumber
8

Jika --no-parenttidak membantu, Anda dapat menggunakan --includeopsi.

Struct direktori:

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

Dan Anda ingin mengunduh downloads/goodtetapi bukan downloads/baddirektori:

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

sumber
5
wget -r http://mysite.com/configs/.vim/

bekerja untukku.

Mungkin Anda memiliki .wgetrc yang mengganggu itu?

Conor McDermottroe
sumber
5

Untuk mengambil direktori secara rekursif dengan nama pengguna dan kata sandi, gunakan perintah berikut:

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

Wget 1,18 dapat bekerja lebih baik, misalnya, saya digigit oleh bug versi 1,12 di mana ...

wget --recursive (...)

... hanya mengambil index.html alih-alih semua file.

Penanganannya adalah untuk melihat beberapa pengalihan 301 dan mencoba lokasi baru - diberi URL baru, wget mendapat semua file di direktori.

setan
sumber
2

Yang Anda butuhkan adalah dua bendera, satu "-r"untuk rekursi dan "--no-parent"(atau -np) agar tidak masuk '.'dan ".." . Seperti ini:

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

Itu dia. Ini akan men-download ke dalam pohon lokal berikut: ./example.com/configs/.vim. Namun jika Anda tidak menginginkan dua direktori pertama, gunakan flag tambahan --cut-dirs=2seperti yang disarankan dalam balasan sebelumnya:

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

Dan itu akan mengunduh pohon file Anda hanya ke ./.vim/

Sebenarnya, saya mendapat baris pertama dari jawaban ini tepatnya dari manual wget , mereka memiliki contoh yang sangat bersih menjelang akhir bagian 4.3.

Jordan Gee
sumber
2

Opsi berikut tampaknya menjadi kombinasi yang sempurna ketika berhadapan dengan unduhan berulang:

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

Cuplikan yang relevan dari halaman manual untuk kenyamanan:

   -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.
sobat
sumber
1

Anda harus dapat melakukannya hanya dengan menambahkan -r

wget -r http://stackoverflow.com/
kasperjj
sumber
9
Ini tidak benar-benar mengunduh direktori, tetapi semua file dapat ditemukan di server, termasuk direktori di atas yang ingin Anda unduh.
Luc
1

Versi ini mengunduh secara rekursif dan tidak membuat direktori induk.

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

Pemakaian:

  1. Tambahkan ke ~/.bashrcatau rekatkan ke terminal
  2. wgetod "http://example.com/x/"
rkok
sumber