Використання wget для рекурсивного отримання каталогу з довільними файлами в ньому


573

У мене є веб-каталог, де я зберігаю деякі конфігураційні файли. Я хотів би використовувати wget, щоб витягнути ці файли і зберегти їх поточну структуру. Наприклад, віддалений каталог виглядає так:

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

.vim вміщує кілька файлів і каталогів. Я хочу повторити це на клієнті за допомогою wget. Не можу знайти правильне поєднання прапорів wget, щоб зробити це. Будь-які ідеї?

Відповіді:


987

Ви повинні передати -np/ --no-parentпараметр wget(на додаток до -r/ --recursive, звичайно), інакше він перейде за посиланням в індексі каталогів на моєму сайті до батьківського каталогу. Отже команда виглядатиме так:

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

Щоб не завантажувати автоматично згенеровані index.htmlфайли, використовуйте -R/ --rejectпараметр:

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

52
add -nH (вирізає ім'я хоста) --cut-dirs = X (вирізає X каталогів). трохи дратує, що доведеться вручну рахувати каталоги для X ..
lkraav

3
Чому жодне з цих не працює для w3.org/History/1991-WWW-NeXT/Implementation ? Він завантажить лише robots.txt
матч

31
@matteo, тому що robots.txt, ймовірно, забороняє сканувати веб-сайт. Вам слід додати -e robots = off, щоб примусити сканувати.
габоровий

додайте -X / абсолютний / шлях / до / папки, щоб виключити конкретний каталог
vishnu narayanan

3
Якщо ви не хочете завантажувати весь вміст, ви можете використовувати: -l1 просто завантажити каталог (у вашому випадку example.com) -l2 завантажити каталог та всі підпапки першого рівня ("example.com/something", але не 'example.com/somthing/foo') І так далі. Якщо ви вставите опцію -l, wget автоматично використовуватиме -l 5. Якщо ви вставите -l 0, ви завантажите весь Інтернет, тому що wget буде дотримуватися кожного знайденого посилання. stackoverflow.com/a/19695143/6785908
так випадковий чувак

123

Для рекурсивного завантаження каталогу, який відхиляє файли index.html * та завантажує без імені хоста, батьківського каталогу та всієї структури каталогу:

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

Я не можу змусити це працювати: wget -r -nH --cut-dirs = 3 --no-parent --reject = "index.html *" w3.org/History/1991-WWW-NeXT/Implementation - -cut-dirs = 2 не працює. Він завантажує лише robots.txt, який фактично знаходиться в кореневій папці. Чого я сумую?
matteo

34
@matteo спробуйте додати: -e robots = off
Пол J

Щоб рекурсивно отримати всі каталоги в каталозі, використовуйте wget -r -nH --reject = "index.html *" mysite.io:1234/dir1/dir2
Ganesan

115

Для всіх, хто має подібні проблеми. Наступний Wget, robots.txtякий може не дозволяти вам захоплювати сайт. Не хвилюйтесь, ви можете вимкнути це:

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

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


Якщо ви ігноруєте robots.txt, вам слід принаймні придушити свої запити. Поведінка, запропонована у цій відповіді, є дуже нечесним.
Ніхто

@Nobody Отже, яка ввічлива відповідь на це?
Фані Рітвій

@PhaniRithvij Оцініть обмеження ваших запитів, wget має для нього параметри. Зауважте, що деякі люди все-таки можуть виправити проблему, і, враховуючи, що файл роботів прямо говорить вам про те, що заборонено робити те, що ви зараз робите, ви можете навіть потрапити в юридичні проблеми.
Ніхто

37

Ви повинні використовувати прапор -m (дзеркало), оскільки це дбає про те, щоб не возитися із часовими позначками та повторюватись на невизначений час.

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

Якщо ви додасте в цій темі точки, згадані іншими, це було б:

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

34

Ось повна команда wget, яка працювала для мене для завантаження файлів із каталогу сервера (ігнорування 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

Якщо це --no-parentне допоможе, ви можете скористатися --includeопцією.

Структура каталогу:

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

І ви хочете завантажити, downloads/goodале не downloads/badкаталог:

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 --user=(put username here) --password='(put password here)' --no-parent http://example.com/

2

Wget 1.18 може працювати краще, наприклад, мене покусав помилка версії 1,12, де ...

wget --recursive (...)

... витягує лише index.html замість усіх файлів.

Обхід був вирішити 301 переадресацію та спробувати нове місце - враховуючи нову URL-адресу, wget отримав усі файли в каталозі.


2

Все, що вам потрібно, це два прапори, один - "-r"для рекурсії та "--no-parent"(або -np) для того, щоб не заходити в '.'і ".." . Подобається це:

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

Це воно. Він буде завантажити в наступному локальне древо ./example.com/configs/.vim. Однак якщо ви не хочете перших двох каталогів, тоді використовуйте додатковий прапор, --cut-dirs=2як було запропоновано у попередніх відповідях:

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

І воно завантажить ваше дерево файлів тільки в ./.vim/

Насправді я отримав перший рядок з цієї відповіді саме з посібника з wget , вони мають дуже чистий приклад до кінця розділу 4.3.


2

Наступний варіант здається ідеальним поєднанням при роботі з рекурсивним завантаженням:

wget -nd -np -P / dest / dir --рекурсивний http: // url / dir1 / dir2

Відповідні фрагменти зі сторінки man для зручності:

   -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

Ви можете це зробити, просто додавши -r

wget -r http://stackoverflow.com/

9
Це насправді не завантажується каталог, але всі файли, які він може знайти на сервері, включаючи каталоги вище того, який ви хочете завантажити.
Люк

1

Ця версія завантажується рекурсивно і не створює батьківських каталогів.

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

Використання:

  1. Додайте до ~/.bashrcтерміналу або вставте його
  2. wgetod "http://example.com/x/"
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.