Cómo calcular un hash para una cadena (url) en bash para el almacenamiento en caché de wget
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)?
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.