2011-06-12 19 views
5

Tengo un script de shell. Un trabajo cron lo ejecuta una vez al día. Por el momento, simplemente descarga un archivo de la web usando wget, agrega una marca de tiempo al nombre del archivo y luego la comprime. Cosas básicas.bash scripting de-dupe

Este archivo no cambia con mucha frecuencia, por lo que quiero descartar el archivo descargado si ya existe.

¿La forma más fácil de hacerlo?

Gracias!

Respuesta

5

¿Realmente necesita comprimir el archivo?
wget proporciona -N, --timestamping que, obviamente, activa el sellado de tiempo. Lo que hace es decir que su archivo se encuentra en www.example.com/file.txt

La primera vez que lo haga:

$ wget -N www.example.com/file.txt 
[...] 
[...] file.txt saved [..size..] 

La próxima vez que va a ser así:

$ wget -N www.example.com/file.txt 
Server file no newer than local file “file.txt” -- not retrieving. 

Excepto si se actualizó el archivo en el servidor.

Eso resolvería su problema, si no comprimió el archivo.
Si realmente necesitas comprimirlo, entonces creo que iría con la comparación del hash del nuevo archivo/archivo y el viejo. Lo que importa en ese caso es, ¿qué tan grande es el archivo descargado? ¿Vale la pena comprimir primero y luego verificar los hash? ¿Vale la pena descomprimir el archivo antiguo y comparar los hashes? ¿es mejor almacenar el antiguo hash en un archivo txt? ¿Todos estos tienen una ventaja sobre sobrescribir el archivo anterior?

Solo lo sabe, realice algunas pruebas.


Así que si vas el camino de hash, considere la compresión sha256 y xz (algoritmo LZMA2).
me gustaría hacer algo como esto (en Bash):

newfilesum="$(wget -q www.example.com/file.txt -O- | tee file.txt | sha256sum)" 
oldfilesum="$(xzcat file.txt.xz | sha256sum)" 
if [[ $newfilesum != $oldfilesum ]]; then 
    xz -f file.txt # overwrite with the new compressed data 
else 
    rm file.txt 
fi 

y que de hecho;

+0

No lo sabía en realidad. Gracias por la información, muy útil. Lamentablemente, el servidor no proporciona ningún encabezado etag o última modificación útil. – aidan

+0

Al ejecutar 'wget' con' -N', la decisión de descargar o no una copia más reciente de un archivo depende del _local_ y _remote_ ** timestamp ** y ** size ** del archivo. Así que si sabe que el archivo crece cada vez que se actualiza y no puede tener el mismo tamaño, o si cree que la posibilidad de que el archivo se actualice y tenga el mismo tamaño es demasiado pequeño, puede usarlo. – c00kiemon5ter

+0

@aidan Edité mi respuesta para proporcionar una solución tipo hash en un momento, compruebe si le conviene;) – c00kiemon5ter

0

¿Qué le parece descargar el archivo y compararlo con un archivo "último guardado"?

Por ejemplo, la primera vez descarga myfile, y la guarda como myfile-[date], y la comprime. También agrega un enlace simbólico, como lastfile apuntando a myfile-[date]. La próxima vez que se ejecuta la secuencia de comandos, puede verificar si el contenido de lo que apunta lastfile es el mismo que el nuevo archivo descargado.

No sé si esto funcionaría bien, pero es lo que se me ocurrió.

+0

Me gusta esta idea. Tenía la esperanza de que hubiera una forma de quitarle importancia sin tener que almacenar un puntero al último archivo. Pero esto funcionará. – aidan

+0

Tornillo. Usaré perl. 'perl -e '% x =(); para (<*>) {$ md5 = \ 'md5sum $ _ \'; siguiente a menos que $ md5 = ~/([0-9a-f] {32}) /; \ 'rm $ _ \' if $ x {$ 1} ++} '' – aidan

1

Calcula un hash del contenido del archivo y compara con el nuevo. Use por ejemplo md5sum. Solo debe guardar la última suma de MD5 para verificar si el archivo ha cambiado.

Además, tenga en cuenta que la web está evolucionando para proporcionar más información sobre páginas, es decir, metadatos. Un sitio web bien fundado debe incluir la versión de archivo y/o la fecha de modificación (o un encabezado válido y caducado) como parte de los encabezados de respuesta. Esto, y todo lo demás, es lo que conforma la escalabilidad de Web 2.0.

0

Puede comparar el archivo nuevo con el último usando el comando sum. Esto toma la suma de comprobación del archivo. Si ambos archivos tienen la misma suma de comprobación, es muy, muy probable que sean exactamente iguales. Hay otro comando llamado md5 que toma la huella dactilar md5 , pero el comando sum está en todos los sistemas.

Cuestiones relacionadas