Como posso fazer o wget renomear arquivos baixados para não incluir a string de consulta?

22

Estou fazendo o download de um site com o wget e muitos dos links têm consultas anexadas a eles, por isso, quando faço isso:

wget -nv -c -r -H -A mp3 -nd http://url.to.old.podcasts.com/

Acabo com muitos arquivos como este:

1.mp3?foo=bar
2.mp3?blatz=pow
3.mp3?fizz=buzz

O que eu gostaria de terminar é:

1.mp3
2.mp3
3.mp3

Isso tudo está acontecendo no Ubuntu Linux e eu tenho o wget 1.10.2.

Eu sei que posso fazer isso depois de obter tudo através de um script para renomear tudo. No entanto, eu realmente gostaria de uma solução de wget para que eu possa ver os nomes corretos como o download está acontecendo.

Alguém pode me ajudar a desvendar isso?

    
por Keith Twombley 26.10.2009 / 20:02

7 respostas

21

Se o servidor for gentil, ele pode estar colocando um cabeçalho Content-Disposition no download avisando seu cliente sobre o nome do arquivo correto. Dizer wget para ouvir esse cabeçalho para o nome do arquivo final é tão simples quanto:

wget --content-disposition

Você precisará de uma nova versão do wget para usar esse recurso.

Eu não tenho idéia de como ele lida com um servidor que reivindica um nome de arquivo '/ etc / passwd'.

    
por 24.08.2011 / 04:41
14

Eu percebi depois de processar um lote grande que eu deveria ter instruído wget a ignorar as strings de consulta. Eu não queria fazer isso de novo, então fiz esse script que funcionou para mim:

# /bin/bash
for i in 'find $1 -type f'
do
    mv $i 'echo $i | cut -d? -f1'
done

Coloque isso em um arquivo como rmqstr e chmod +x rmqstr Sintaxe: ./rmqstr <directory (defaults to .)>

Ele removerá as strings de consulta de todos os nomes de arquivos de forma recursiva.

    
por 29.12.2015 / 23:45
4

Eu acho que, para obter wget para salvar como um nome de arquivo diferente do URL especificado, você precisa usar o argumento -O filename . Isso só faz o que você quer quando você dá a ele um único URL - com vários URLs, todo o conteúdo baixado acaba em filename .

Mas essa é realmente a resposta. Em vez de tentar fazer tudo em um comando wget , use vários comandos. Agora seu fluxo de trabalho se torna:

  1. Execute wget para obter o (s) arquivo (s) HTML básico contendo seus links;
  2. Analisar URLs;
  3. Para o URL que termina em mp3 ,
    1. process URL para obter um nome de arquivo (por exemplo, transformar http://foo/bar/baz.mp3?gargle=blaster em baz.mp3
    2. (opcional) verifique se o nome do arquivo não existe
    3. executar wget <URL> -O <filename>

Isso resolve seu problema, mas agora você precisa descobrir como obter os arquivos de base para encontrar seus mp3 URLs.

Você tem em mente um site / URL específico? Os passos 1 e 3 serão mais fáceis de lidar com um exemplo concreto.

    
por 26.10.2009 / 21:35
1

so I can see the correct names as the download is happening.

OK. Use wget como você faz normalmente; use o script post-wget que você normalmente usa, mas processe a saída do wget para que fique mais fácil:

#! /bin/sh
exec wget --progress=bar:force $* 2>&1 | \
  perl -pe 'BEGIN { $| = 1 } s,(?<=')([^\x27?]+),\e[36;1m$1\e[0m, if /^Saving/'
cgi-cut # rename files

Isso ainda mostrará o ?foo=bar durante o download, mas exibirá o restante do nome em ciano brilhante.

    
por 26.10.2009 / 22:12
1

Eu tenho uma abordagem semelhante ao @Gregory Wolf porque seu código sempre criava mensagens de erro como esta:

mv: './file' and './file' are the same file

Assim, primeiro verifico se existe uma string de consulta no nome do arquivo antes de mover o arquivo:

for f in $(find $1 -type f); do
    if [ $f = ${f%%\?*} ]; then continue; fi
    mv "${f}" "${f%%\?*}"
done

Isso verificará recursivamente todos os arquivos e removerá todas as strings de consulta em seus nomes de arquivos, se disponíveis.

    
por 29.06.2018 / 15:01
0

Veja esses dois comandos que criei para clonar um site e, depois que o clone estiver pronto, você poderá executar o segundo comando.

O segundo comando dará uma olhada no clone inteiro, procurará por "? " nomes de padrões de arquivo e removerá a string de consulta do nome do arquivo.

# Clone entire site.
    wget --content-disposition --execute robots=off --recursive --no-parent --continue --no-clobber http://example.com

# Remove query string from a static resource.
for i in 'find $1 -type f -name "*\?*"'; do mv $i 'echo $i | cut -d? -f1'; done

(Veja em GitHub Gist .)

    
por 23.01.2018 / 09:00
-2

Ainda mais fácil é isso: link

Isso sugere um método que essencialmente usa a função renomear do wget (pode ser alterada para incluir o diretório) para vários arquivos. Veja a segunda versão proposta.

    
por 21.01.2016 / 14:16