Como calcular um hash para uma string (url) em bash para wget caching
Pergunta
Estou construindo uma pequena ferramenta que irá baixar arquivos usando wget, lendo as urls de arquivos diferentes. O mesmo url pode estar presente em diferentes arquivos; a url pode mesmo estar presente em um arquivo várias vezes. Seria ineficiente para download de uma página várias vezes (cada vez que o seu url encontrado na lista (s)).
Assim, a abordagem simples é salvar o arquivo baixado e para instruir o wget não baixá-lo novamente se ele já está lá.
Isso seria muito simples; No entanto, os URLs são muito longos (muitos parâmetros GET) e, portanto, não pode ser usado como tal para nomes de arquivos (wget dá o erro 'Não é possível gravar ... [] nome do arquivo muito longo').
Então, eu preciso para renomear os arquivos baixados. Mas para o mecanismo de cache para o trabalho, as necessidades de esquema de renomeação para implementar "um url <=> um nome": se um determinado url pode ter vários nomes, o cache não funciona (ou seja, se eu simplesmente número os arquivos na ordem eles são encontrados, eu não vou deixar wget identificar quais URLs já foram baixados).
O esquema de renomeação simples seria para calcular um hash MD5 do nome do arquivo (e não do arquivo em si, que é o que md5sum faz); que asseguraria o nome do arquivo é única e que uma determinada URL resulta em sempre o mesmo nome.
É possível fazer isso em Perl, etc., mas isso pode ser feito diretamente no bash ou usando um utilitário de sistema (RedHat)?
Solução
Parece que você deseja que o utilitário sistema md5sum.
URLMD5=`/bin/echo $URL | /usr/bin/md5sum | /bin/cut -f1 -d" "`
Se você quiser criar apenas o hash no nome do arquivo, você pode conseguir isso rapidamente com sed:
FILENAME=`echo $URL | /bin/sed -e 's#.*/##'`
URLMD5=`/bin/echo $FILENAME | /usr/bin/md5sum | /bin/cut -f1 -d" "`
Note que, dependendo da sua distribuição, o caminho para cut
pode ser /usr/bin/cut
.
Outras dicas
Eu não tenho o representante a comentar sobre a resposta, mas há um esclarecimento para a resposta de Epsilon Prime: por padrão, o ECHO irá imprimir uma nova linha no final do texto. Se você quiser as somas MD5 para corresponder-se com o que vai ser gerado por qualquer outra ferramenta (por exemplo, php, md5 de Java, etc) você precisa chamar
echo -n "$url"
que irá suprimir a nova linha.
Outras opções na minha caixa de Ubuntu (preciso):
-
echo -n $STRING | sha512sum
-
echo -n $STRING | sha256sum
-
echo -n $STRING | sha224sum
-
echo -n $STRING | sha384sum
-
echo -n $STRING | sha1sum
-
echo -n $STRING | shasum
Outras opções no meu Mac:
-
echo -n $STRING | shasum -a 512
-
echo -n $STRING | shasum -a 256
- etc.
Novas versões do Bash fornecer uma matriz associativa, bem como uma matriz indexada . Algo como este trabalho poder para você:
declare -A myarray
myarray["url1"]="url1_content"
myarray["url2"]=""
if [ ! -z ${myarray["url1"]} ] ; then
echo "Cached";
fi
wget normalmente renomear os arquivos com um filename.html.1, 0,2, etc., para que você possa usar a matriz associativa para armazenar uma lista dos quais um foi transferido e que o nome do arquivo real era.