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)?

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top