Por padrão, wget grava em um arquivo cujo nome é o último componente do URL que você passa para ele. Muitos servidores redirecionam URLs como http://www.url1.com/app?q=123&gibb=erish&gar=ble
para um URL diferente com um nome de arquivo bonito, como http://download.url1.com/files/something.pdf
. Você pode dizer ao wget para usar o nome do URL redirecionado (por exemplo, something.pdf
) em vez de app?q=123&gibb=erish&gar=ble
passando a opção --trust-server-names
. Este não é o modo padrão porque, se usado de forma descuidada, pode levar a sobrescrever um nome de arquivo imprevisível no diretório atual; mas se você confia no servidor ou está trabalhando em um diretório que não contém outros arquivos preciosos, --trust-server-names
geralmente é a coisa certa para usar.
Alguns servidores usam um cabeçalho Content-Disposition
em vez de redirecionamento para especificar um nome de arquivo. Passe a opção --content-disposition
para fazer o wget usar este nome de arquivo.
Assim:
wget --content-disposition --trust-server-names -i list_of_urls
Se você ainda não estiver conseguindo nomes de arquivos bonitos, talvez queira especificar os seus próprios. Suponha que você tenha um arquivo contendo linhas como
http://www.url1.com/app?q=123&gibb=erish&gar=ble foo.pdf
http://www.url2.com/app?q=111&wha=tcha&mac=allit bar.txt
Para fazer o wget, faça o download dos arquivos para os nomes de arquivo especificados, assumindo que não há caracteres em branco na URL ou nos nomes dos arquivos:
err=0
while read -r url filename tail; do
wget -O "$filename" "$url" || err=1
done <list_of_urls_and_file_names
A variável err
contém 0 se todos os downloads forem bem-sucedidos e 1 caso contrário, você poderá return $err
se colocar este trecho em uma função ou exit $err
se colocar este trecho em uma string.
Se você não quiser especificar nada além das URLs e não conseguir nomes legais no servidor, poderá adivinhar o tipo de arquivo e tentar obter pelo menos extensões significativas.
err=0
n=1
while read -r url; do
if wget -O tmpfile "$url"; then
ext=data
case $(file -i tmpfile) in
application/pdf) ext=pdf;;
image/jpeg) ext=jpg;;
text/html) ext=html;;
text/*) ext=txt;;
esac
mv tmpfile "$n.$ext"
else
err=1
fi
n=$((n+1))
done
Adicione outros tipos conforme desejado. Se o comando file
não tiver a opção -m
, deixe-a de fora e verifique o que o file
retorna no seu sistema para os tipos de arquivo de seu interesse. Se você tiver um arquivo /etc/mime.types
no seu sistema, você pode ler associações de tipos MIME para extensões dele em vez de fornecer sua própria lista:
n=1
while read -r url; do
if wget -O tmpfile "$url"; then
mime_type=$(file -m tmpfile)
ext=$(awk "$1 == \"$mime_type\" {print \; exit} END {print \"data\"}" /etc/mime.types)
mv tmpfile "$n.$ext"
else
err=1
fi
n=$((n+1))
done