3

Я хочу, чтобы 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, которые изначально не нужны, / впоследствии удаляет их)

2 ответа2

6

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

Чтобы выполнить «Если файл 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"${bl[*]}" -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 '{}' \+

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

2

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

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .