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

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

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

Например:

еслифу.oggдоступно, не скачивайтефу.mp3


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

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

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

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

решение1

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

Для выполнения «Если файлИкссуществует, скачайте его; в противном случае скачайте файлу", вы можете сделать следующее:

wget x || wget y

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

Рекурсивно

Это, очевидно, не поможет вам в вашей рекурсивной загрузке, хотя. Я был бы удивлен, если бы 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) или имена файлов будут содержать пробелы (это нарушит список блоков, что потенциально даст вам и дополнительный файл, и (маловероятно) отсутствующий файл). Оба варианта можно исправить.

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

Описание отличного предложения @Bob

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

После получения файлов 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 впоследствии будут удалены.

Связанный контент