Wget - condição de download if / else?

Wget - condição de download if / else?

Quero que o wget prefira um determinado tipo de arquivo a outro, se os arquivos tiverem o mesmo nome de base.

Por exemplo:

sefoo.oggdisponível, não baixefoo.mp3


a maneira como uso o wget até agora para rastrear/baixar automaticamente (se alguém estiver interessado):

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

mas isso, claro,me pega .mp3 E .oggarquivos. Alguma ideia?

  • (Explicação de sintaxe:
    -D: baixe apenas deste domínio
    -I: baixe apenas desta subpasta do domínio
    -r: recursivo (segue links e estrutura de diretório)
    -l 1: siga apenas 1 link profundo
    -nc: sem clobber = download somente se o arquivo não existir
    -A: aceita/baixa apenas todos os *.ogg e *.mp3 (descarte os arquivos html necessários)
    (-i (opcionalmente na frente do URL): lê URLs do URL, mas também baixa outros tipos de arquivos como .png que você não queria em primeiro lugar/descarta-os depois)

Responder1

Arquivos únicos

Para realizar "Se arquivoxexiste, baixe-o; caso contrário, baixe o arquivosim", você pode fazer o seguinte:

wget x || wget y

Sexexiste, ele é baixado e wgetretorna true, portanto a segunda parte é ignorada. Sexnão existe, wgetretorna algum código de erro (provavelmente 8) e a segunda parte da expressão é avaliada (que baixasim).

Recursivamente

Obviamente, isso não ajudará muito no download recursivo. Eu ficaria surpreso se wgethouvesse instalações para acomodar máscaras com esse nível de sofisticação. A página de manual também não parece cobrir nenhuma forma de condicionais sofisticadas. Uma abordagem ligeiramente modificada poderia funcionar, no entanto.

(Parece ser difícil convencer wgeta produzir uma lista de coisas que deseja baixar. Minha primeira ideia foi criá-la e filtrá-la adequadamente antes de fazer o download, como sugere @utkuerd.)

Um ponto de partida seria naturalmente baixar todos os arquivos ogg primeiro, presumivelmente por

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

Os arquivos mp3 restantes poderão ser baixados pelo mesmo método, desde que você tenha uma máscara adequada para fornecer como uma --rejectlista. Esta lista deve conter o nome de cada arquivo mp3 que você não deseja baixar.

Supondo que eu sugiro que você crie esta lista da seguinte maneira

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

Agora você tem uma matriz bash de arquivos mp3 para bloquear.

Para baixar apenas os arquivos mp3 desbloqueados, você pode usar

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

A IFSvariável deve ser modificada para que a lista não fique separada por espaços.

Obviamente, isso irá mal em vários graus se a lista de arquivos ogg for maior que getconf ARG_MAX(isso quebrará o comando wget) ou os nomes dos arquivos contiverem espaços em branco (isso quebrará a lista de bloqueio, potencialmente fornecendo a você um arquivo extra e (improvável) um arquivo ausente arquivo). Ambos podem ser corrigidos.

Observe que vírgulas supérfluas na lista de rejeição forneceminteressanteresultados.

Redação da excelente sugestão de @Bob

(veja o comentário abaixo)

Depois de obter os arquivos ogg com

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

você poderia criar arquivos mp3 fictícios como este

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

e obtenha os arquivos mp3 restantes com (explorando -nc)

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

Os arquivos mp3 supérfluos podem então ser removidos com algo como

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

Testei que isso funciona com espaços nos nomes.

Responder2

Não creio que a opção -A do wget tenha o poder de escolher entre determinados padrões de nomes de arquivos de maneira inteligente. Muito provavelmente você precisa de um script para conseguir o que deseja. Você deve buscar a listagem de diretórios, analisá-la e baixar os arquivos desejados.

Para arquivos .png sendo baixados e descartados, você usou o sinalizador -i incorretamente. O sinalizador -i especifica um arquivo (ou URL) que contém URLs para download. Você deve especificar o ponto de partida sem qualquer sinalizador. Se você remover o sinalizador -i, nenhum outro tipo de arquivo será baixado, apenas .ogg, .mp3 e os arquivos html necessários. arquivos html são descartados posteriormente.

informação relacionada