Использование wget для рекурсивного извлечения каталога с произвольными файлами в нем

573

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

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

.vim содержит несколько файлов и каталогов. Я хочу воспроизвести это на клиенте, используя wget. Не могу найти правильную комбинацию флагов wget, чтобы сделать это. Любые идеи?

jerodsanto
источник

Ответы:

988

Вы должны передать -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
matteo
31
@matteo, потому что robots.txt, вероятно, не позволяет сканировать сайт. Вы должны добавить -e robots = off для принудительного сканирования.
Габорист
добавьте -X / absolute / path / to / folder, чтобы исключить конкретный каталог
vishnu narayanan
3
Если вы не хотите загружать весь контент, вы можете использовать: -l1 просто скачать каталог (в вашем случае example.com) -l2 скачать каталог и все подпапки уровня 1 («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
Sriram
источник
Я не могу заставить это работать: wget -r -nH --cut-dirs = 3 --no-parent --reject = "index.html *" w3.org/History/1991-WWW-NeXT/Implementation - -cut-dirs = 2 также не работает. Он загружает только файл robots.txt, который фактически находится в корневой папке. Где мне не хватает?
Маттео
34
@matteo попробуйте добавить: -e роботы = выкл
Пол Дж
Чтобы рекурсивно получить все каталоги в каталоге, используйте wget -r -nH --reject = "index.html *" mysite.io:1234/dir1/dir2
Prasanth
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, вы должны хотя бы ограничить свои запросы. Поведение, предложенное в этом ответе, очень невежливо.
Никто не
@ Никто так, каков вежливый ответ на это?
Фани Ритвий
@PhaniRithvij Оцените ограничение ваших запросов, у wget есть параметры для него. Обратите внимание, что некоторые люди все еще могут столкнуться с проблемой, и, учитывая, что файл роботов явно говорит вам, что ему запрещено делать то, что вы делаете в настоящее время, вы можете даже столкнуться с юридическими проблемами.
Никто
37

Вы должны использовать флаг -m (зеркало), так как он заботится о том, чтобы не связываться с метками времени и повторяться бесконечно.

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

Если вы добавите пункты, упомянутые другими в этой теме, это будет:

wget -m -e robots=off --no-parent http://example.com/configs/.vim/
SamGoody
источник
35

Вот полная команда 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 http://mysite.com/configs/.vim/

работает для меня.

Возможно, у вас есть .wgetrc, который ему мешает?

Конор МакДермоттро
источник
5

Чтобы извлечь каталог рекурсивно с использованием имени пользователя и пароля, используйте следующую команду:

wget -r --user=(put username here) --password='(put password here)' --no-parent http://example.com/
prayagupd
источник
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/
kasperjj
источник
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/"
rkok
источник