Wget - если / еще условие загрузки?

3077
Kai

Я хочу, чтобы wget предпочел определенный тип файла другому, если файлы имеют одинаковое базовое имя.

Например:

если доступно foo.ogg, не загружайте foo.mp3


способ, которым я до сих пор использую wget для сканирования / автоматической загрузки (если кому-то интересно):

wget -Dfoo.com -I /folder/ -r -l 1 -nc -A.ogg,.mp3 http://www.foo.com/folder/ 

но это, конечно, дает мне файлы .mp3 AND .ogg . Есть идеи?

  • (Синтаксис-Объяснение:
    -D: загрузка только из этого домена
    -I: загрузка только из этой подпапки домена
    -r: рекурсивная (переход по ссылкам и структуре каталогов)
    -l 1:
    переход только по 1 ссылке в глубину -nc: без clobber = загрузка только если файл не существует
    -A: принять / загрузить только все * .ogg и * .mp3 (отменить необходимые html-файлы)
    (-i (опционально перед URL-адресом): считывает URL-адреса из URL-адреса, но также загружает другие типы файлов, такие как .png, которые вы не хотели в первую очередь / затем удаляете)
3

2 ответа на вопрос

6
Eroen

Отдельные файлы

Чтобы выполнить «Если файл x существует, загрузите его; в противном случае загрузите файл y », вы можете сделать следующее:

wget x || wget y 

Если x существует, он загружается и wgetвозвращается true, поэтому вторая часть пропускается. Если x не существует, wgetвозвращает некоторый код ошибки (вероятно, 8) и вычисляется вторая часть выражения (которая загружает y ).

Рекурсивный

Это, очевидно, не сильно поможет вам в вашей рекурсивной загрузке. Я был бы удивлен, если бы wgetимел средства для размещения маскировки с таким уровнем сложности. Страница справочника также не покрывает какие-либо необычные условия. Немного измененный подход может работать, хотя.

(Кажется, трудно убедить wgetсоставить список вещей, которые он хочет загрузить. Моя первая идея состояла в том, чтобы создать это и отфильтровать его соответствующим образом перед загрузкой, очень похоже на @utkuerd.)

Естественно, отправной точкой будет сначала загрузить все файлы ogg, предположительно

wget -Dfoo.com -I /folder/ -r -l 1 -nc -A.ogg -i http://www.foo.com/folder/ 

Остальные mp3-файлы могут быть загружены тем же способом, если у вас есть подходящая маска для представления в виде --rejectсписка. Этот список должен содержать название каждого mp3-файла, который вы не хотите загружать.

Предполагая, что я предлагаю вам создать этот список следующим образом

bl=($(find ./ -name '*.ogg' -exec basename -s .ogg {} \+ | sed 's/\(^.\+$\)/\1.mp3/' ) ) 

Теперь у вас есть массив bash из mp3-файлов для блокировки.

Чтобы скачать только разблокированные mp3-файлы, вы можете использовать

IFS=','; wget -Dfoo.com -I /folder/ -r -l 1 -nc -A.mp3 -R"$" -i http://www.foo.com/folder/; unset IFS 

IFSПеременная должна быть изменена таким образом, список не будет разделенных пробелами.

Очевидно, что это пойдет плохо в разной степени, если список файлов OGG длиннее getconf ARG_MAX(это нарушит команду wget) или имена файлов содержат пробелы (это нарушит список блоков, потенциально предоставляя вам и дополнительный файл и (маловероятно) отсутствующий файл). Оба исправимы.

Обратите внимание, что лишние запятые в списке отклонений дают интересные результаты.

Рецензия на замечательное предложение @ Боба

(см. комментарий ниже)

После получения файлов OGG с

wget -Dfoo.com -I /folder/ -r -l 1 -nc -A.ogg -i http://www.foo.com/folder/ 

вы могли бы создать фиктивные mp3-файлы, как так

find ./ -name '*.ogg' | sed 's/ogg$/mp3/' | xargs -d '\n' touch 

и получить оставшиеся файлы mp3 с помощью (эксплуатации -nc)

wget -Dfoo.com -I /folder/ -r -l 1 -nc -A.mp3 -i http://www.foo.com/folder/ 

Лишние mp3-файлы могут быть удалены с помощью чего-то вроде

find ./ -name '*.mp3' -size 0 -exec rm '{}' \+ 

Я проверил, что это работает с пробелами в именах.

Я как бы подумываю о «пакетном файле Windows», но было бы невозможно (вместо указания списка отклонений и, так как указан `-nc`) загрузить все файлы` ogg`, перебрать их все ` коснитесь `mp3` файла с тем же именем (0 байт), загрузите все как` mp3` с `-nc`, в результате чего те, которые существуют как` ogg` и с соответствующим 0 байтом `mp3`, будут пропущены, затем выполните цикл `ogg`s, чтобы удалить их mp3-версии (или просто удалите все 0-байтовые` mp3`s). Список отклонений, вероятно, лучше, хотя это позволит полностью избежать проблем `ARG_MAX` и пробелов. Bob 12 лет назад 2
Отлично, работает как шарм! Спасибо всем большое. Теперь я решил, что загрузка с помощью указанной выше команды может занять очень много времени, особенно если файлы иногда на 1 ссылку глубже в структуре каталогов: сначала мне нужно скачать / проанализировать все, чтобы добраться до .ogg-файлов, затем опять же мне нужно сделать то же самое для остальных .mp3-файлов, так как я -A.ogg, он отбросил html-файлы для анализа ... ** Есть ли способ не отбрасывать .html-файлы, чтобы иметь возможность разбирать их второй раз в автономном режиме? ** Kai 12 лет назад 0
чтобы сохранить html-файлы, я бы просто использовал опцию `-A ogg, htm, html`. Kai 12 лет назад 0
2
infiniteRefactor

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

Для файлов .png, которые загружаются и удаляются, вы неправильно указали флаг -i. Флаг -i указывает файл (или URL), который содержит URL для загрузки. Вы должны указать начальную точку без каких-либо флагов. Если вы уберете флаг -i, другие типы файлов не будут загружены, кроме только .ogg, .mp3 и необходимых html-файлов. HTML-файлы впоследствии удаляются.

В качестве альтернативы я могу анализировать все URL-адреса из сохраненного HTML-индекса с помощью `awk 'BEGIN " nr="">2 'index.html >> url-list.txt`, удаляя ненужные строки вручную, а затем загружая через: `wget -v -nc -A ogg -i url-list.txt` ** Как разобрать только определенные URL-адреса **, как www.foo.com/(randomfolder)/(randomfilename).mp3 Kai 12 лет назад 0
** О -I: ** я попытался оставить -I / folder и / или изменить -D на -Dwww.foo.com/folder, однако ни один из них не оказал никакого влияния на файлы .png, которые все еще загружаются. Руководство wget гласит: опция _-I 'принимает разделенный запятыми список каталогов, включенных в поиск. Любые другие каталоги будут просто игнорироваться. Каталоги являются абсолютными путями. "Так что, если вы хотите скачать с http: // host / people / bozo / ', следуя только ссылкам на коллег bozo в каталоге` / people' и поддельные скрипты в / cgi-bin ', Вы можете указать: _ (...) Kai 12 лет назад 0
(...) В поддельных скриптах в `/ cgi-bin 'вы можете указать: wget -I / people, / cgi-bin http: // host / people / bozo / _" ---- (очевидно, это также говорит, что -D имеет смысл только при использовании с -H (позволяя wget «охватывать», чтобы переходить по ссылкам / скачивать на другие домены) - он все равно создает каталоги для других доменов, которые я не хотел, хотя) Kai 12 лет назад 0
В этом нет ничего плохого. Я имел в виду опцию -i (маленький I), которую вы использовали в конце, перед URL. Я не думаю, что вам это нужно, и когда вы используете его, все URL-адреса в индексном файле (включая значки папок и т. Д.) Загружаются перед сбросом. infiniteRefactor 12 лет назад 1
отлично, спасибо! извини, я не остерегался, ты был прав. Kai 12 лет назад 0