
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 wget
retorna true
, portanto a segunda parte é ignorada. Sexnão existe, wget
retorna 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 wget
houvesse 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 wget
a 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 --reject
lista. 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 IFS
variá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.