Cómo calcular un hash para una cadena (url) en bash para el almacenamiento en caché de wget

StackOverflow https://stackoverflow.com/questions/1602378

  •  05-07-2019
  •  | 
  •  

Pregunta

Estoy creando una pequeña herramienta que descargará archivos usando wget, leyendo las URL de diferentes archivos. La misma URL puede estar presente en diferentes archivos; la url incluso puede estar presente en un archivo varias veces. Sería ineficiente descargar una página varias veces (cada vez que su URL se encuentre en la (s) lista (s)).

Por lo tanto, el enfoque simple es guardar el archivo descargado e indicarle a wget que no lo descargue nuevamente si ya está allí.

Eso sería muy sencillo; sin embargo, las URL son muy largas (muchos parámetros GET) y, por lo tanto, no se pueden usar como tales para los nombres de archivo (wget da el error 'No se puede escribir en ... [] nombre de archivo demasiado largo').

Entonces, necesito cambiar el nombre de los archivos descargados. Pero para que el mecanismo de almacenamiento en caché funcione, el esquema de cambio de nombre debe implementar & Quot; one url & Lt; = & Gt; one name " ;: si una url dada puede tener varios nombres, el almacenamiento en caché no funciona (es decir, si simplemente enumero los archivos en el orden en que se encuentran, no dejaré que wget identifique qué urls ya han sido descargado).

El esquema de cambio de nombre más simple sería calcular un hasd md5 del nombre de archivo (y no del archivo en sí, que es lo que hace md5sum); eso aseguraría que el nombre de archivo sea único y que una URL dada siempre tenga el mismo nombre.

Es posible hacer esto en Perl, etc., pero ¿se puede hacer directamente en bash o usando una utilidad del sistema (RedHat)?

¿Fue útil?

Solución

Suena como si quisieras la utilidad del sistema md5sum.

URLMD5=`/bin/echo $URL | /usr/bin/md5sum | /bin/cut -f1 -d" "`

Si solo desea crear el hash en el nombre de archivo, puede obtenerlo rápidamente con sed:

FILENAME=`echo $URL | /bin/sed -e 's#.*/##'`
URLMD5=`/bin/echo $FILENAME | /usr/bin/md5sum | /bin/cut -f1 -d" "`

Tenga en cuenta que, según su distribución, la ruta a cut puede ser /usr/bin/cut.

Otros consejos

No tengo el representante para comentar la respuesta, pero hay una aclaración a la respuesta de Epsilon Prime: por defecto, echo imprimirá una nueva línea al final del texto. Si desea que las sumas md5 coincidan con lo que generará cualquier otra herramienta (por ejemplo, php, md5 de Java, etc.), debe llamar

echo -n "$url"

que suprimirá la nueva línea.

Otras opciones en mi cuadro 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

Otras opciones en mi Mac:

  • echo -n $STRING | shasum -a 512
  • echo -n $STRING | shasum -a 256
  • etc.

Las versiones más recientes de Bash proporcionan una matriz asociativa, así como una matriz indexada . Algo como esto podría funcionar para usted:

declare -A myarray
myarray["url1"]="url1_content"
myarray["url2"]=""

if [ ! -z ${myarray["url1"]} ] ; then 
    echo "Cached";
fi

wget normalmente cambiará el nombre de los archivos con un nombre de archivo.html.1, .2, etc., para que pueda usar la matriz asociativa para almacenar una lista de cuál se ha descargado y cuál era el nombre de archivo real.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top