Wget - se / mais condição de download?

3

Eu quero que wget prefira um tipo de arquivo em vez de outro, se os arquivos tiverem o mesmo nome de base.

Por exemplo:

se foo.ogg estiver disponível, não faça o download foo.mp3


o jeito que eu uso wget tão longe 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 envia arquivos .mp3 AND .ogg . Alguma idéia?

  • (Sintaxe-Explicação:
    -D: baixe apenas deste domínio
    -I: baixe apenas desta subpasta de Domain
    -r: recursivo (segue links e estrutura de diretório)
    -l 1: siga apenas 1 link deep
    -nc: no clobber = download somente se o arquivo não existe -A: aceitar / baixar apenas todos os arquivos * .ogg e * .mp3 (descartar os arquivos html necessários)
    (-i (opcionalmente na frente do URL): lê os URLs do URL, mas também faz o download de outros tipos de arquivos como .png que você não queria, em primeiro lugar, descartando-os posteriormente)
por Kai 13.04.2012 / 17:04

2 respostas

6

Arquivos únicos

Para realizar "Se o arquivo x existir, baixe-o; caso contrário, baixe o arquivo y ", você pode fazer o seguinte:

wget x || wget y

Se x existir, ele será baixado e wget retornará true , portanto, a segunda parte será ignorada. Se x não existir, wget retornará algum código de erro (provavelmente 8) e a segunda parte da expressão será avaliada (o que será feito em y ).

Recursivamente

Isso, obviamente, não ajudará muito no seu download recursivo. Eu ficaria surpreso se wget tivesse as facilidades para acomodar o mascaramento com esse nível de sofisticação. A página man não parece cobrir qualquer forma de condicionais extravagantes. Uma abordagem ligeiramente modificada poderia funcionar, no entanto.

(Parece ser difícil convencer wget a produzir uma lista de coisas que deseja baixar. Minha primeira idéia foi criar isso e filtrá-lo apropriadamente antes de fazer o download, muito parecido com o @utkuerd sugere.)

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 podem ser baixados pelo mesmo método, desde que você tenha uma máscara adequada para fornecer como uma lista --reject . 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 forma

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

Agora você tem uma matriz bash dos 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 variável IFS deve ser modificada para que a lista não seja separada por espaços.

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

Observe que as vírgulas supérfluas na lista de rejeições fornecem resultados interessantes .

Escrita 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ê pode criar arquivos mp3 fictícios, como

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 ser removidos com algo como

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

Eu testei que isso funciona com espaços nos nomes.

    
por 13.04.2012 / 17:42
2

Eu não acho que -Uma opção do wget tenha o poder de escolher entre os padrões de nome de arquivo fornecidos de uma maneira inteligente. Muito provavelmente você precisa de um script para conseguir o que deseja. Você deve buscar a listagem do diretório, analisá-la e baixar os arquivos desejados.

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

    
por 13.04.2012 / 18:31