Wget с подстановочными знаками в загрузках http


53

Мне нужно скачать файл с помощью wget, однако я точно не знаю, каким будет имя файла.

https://foo/bar.1234.tar.gz

Согласно справочной странице , wget позволяет вам отключать и включать глобализацию при работе с ftp-сайтом, однако у меня есть http-URL.

Как я могу использовать подстановочный знак при использовании wget? Я использую GNU Wget.

Вещи, которые я попробовал.

/usr/local/bin/wget -r "https://foo/bar.*.tar.gz" -P /tmp

Обновить

Использование -A приводит к загрузке всех файлов, заканчивающихся на .tar.gz на сервере.

/usr/local/bin/wget -r "https://foo/" -P /tmp -A "bar.*.tar.gz"

Обновить

Из ответов это синтаксис, который в итоге сработал.

/usr/local/bin/wget -r -l1 -np "https://foo" -P /tmp -A "bar*.tar.gz"

2
Это не совсем то, что вы ищете, но это связано: в Curl есть возможность использовать основные символы подстановки, например:curl "http://example.com/picture[1-10].jpg" -o "picture#1.jpg"
Hello World

1
Одна проблема для меня - -e robots=offпараметр не подчиняться robots.txt: stackoverflow.com/a/11124664/1097104
Юусо Охтонен,

Я нашел добавление флагов -nHи --cut-dirs=<number>был также полезен
Рэндалл

Ответы:


62

Я думаю, что эти переключатели будут делать то, что вы хотите с wget:

   -A acclist --accept acclist
   -R rejlist --reject rejlist
       Specify comma-separated lists of file name suffixes or patterns to 
       accept or reject. Note that if any of the wildcard characters, *, ?,
       [ or ], appear in an element of acclist or rejlist, it will be 
       treated as a pattern, rather than a suffix.

   --accept-regex urlregex
   --reject-regex urlregex
       Specify a regular expression to accept or reject the complete URL.

пример

$ wget -r --no-parent -A 'bar.*.tar.gz' http://url/dir/

15

Есть веская причина, по которой это не может работать напрямую с HTTP, и это то, что URL не является путем к файлу, хотя использование /в качестве разделителя может сделать его похожим на один, и они иногда соответствуют. 1

Традиционно (или исторически) веб-серверы часто отражают иерархию каталогов (для некоторых - например, Apache - это своего рода интеграл) и даже предоставляют индексы каталогов, очень похожие на файловую систему. Однако ничто в протоколе HTTP не требует этого.

Это очень важно, потому что если вы хотите применить Glob на говорим, все , что является подпутем http://foo/bar/, если сервер не предоставляет какой - то механизм , чтобы предоставить вам такой (например , упомянутый выше индекс), нет ничего , чтобы применить его в Glob к . Там нет файловой системы для поиска. Например, только потому, что вы знаете, что есть страницы, http://foo/bar/one.htmlи http://foo/bar/two.htmlэто не значит, что вы можете получить список файлов и подкаталогов через http://foo/bar/. Было бы полностью в пределах протокола для сервера, чтобы возвратить 404 для этого. Или он может вернуть список файлов. Или он может отправить вам хорошую картинку JPG. И т.п.

Таким образом, здесь нет стандарта, который wgetможно использовать. AFAICT, wget работает для зеркального отображения иерархии путей , активно изучая ссылки на каждой странице . Другими словами, если вы рекурсивно отражаете http://foo/bar/index.htmlего, он загружает, index.htmlа затем извлекает ссылки, которые являются подпутями этого. 2-A переключатель просто фильтр , который применяется в этом процессе.

Короче говоря, если вы знаете, что эти файлы где-то проиндексированы, вы можете начать с этого, используя -A. Если нет, то вам не повезло.


1. Конечно, URL-адрес FTP тоже является URL-адресом. Однако, хотя я не очень разбираюсь в протоколе FTP, я предполагаю, исходя из его природы, что он может иметь форму, которая допускает прозрачное глобирование.

2. Это означает, что может быть действительный URL http://foo/bar/alt/whatever/stuff/, который не будет включен, потому что он никоим образом не связан ни с чем в наборе вещей, связанных с http://foo/bar/index.html. В отличие от файловых систем, веб-серверы не обязаны делать макет своего контента прозрачным, и при этом им не нужно делать это интуитивно очевидным способом.


0

Приведенное выше решение «-A pattern» может не работать с некоторыми веб-страницами. Это мой обходной путь, с двойным wget:

  1. wget страница
  2. grep для картины
  3. wget файлы)

Пример: предположим, что это новостная страница подкаста, и я хочу 5 mp3-файлов сверху страницы:

wget -nv -O- https://example/page/ |
 grep -o '[^"[:space:]]*://[^"[:space:]]*pattern[^"[:space:]]*\.mp3' |
  head -n5 | while read x; do
    sleep $(($RANDOM % 5 + 5))  ## to appear gentle and polite
    wget -nv "$x"
  done

The grepищет двойные кавычки без пробелов, которые содержат ://и мое имя файла pattern.


что здесь СЛУЧАЙНО?
Ройки

Переменная оболочки, см bash. Справочную страницу. RANDOM Каждый раз при обращении к этому параметру генерируется случайное целое число от 0 до 32767.
ночная смена
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.