2011-01-14 38 views
9

Tengo un script Bash que copia archivos repetidamente cada 5 segundos. Pero esto es un toque exagerado ya que generalmente no hay cambio.Script Bash: determine si se modificó el archivo.

que sé sobre el comando Linux watch pero a medida que este script se utilizará en los ordenadores OS X (que no tienen watch, y yo no quiero hacer que todos se instale macports) Tengo que ser capaz de comprobar si un archivo se modifica o no con el código Bash directo.

¿Debo estar revisando el tiempo de modificación del archivo? ¿Cómo puedo hacer eso?

Edit: Estaba esperando expandir mi script para hacer algo más que copiar el archivo, si detecta un cambio. Entonces, ¿hay una manera pura de hacer esto?

+0

Tal vez usted puede usar 'rsync' en su lugar? Puede comparar la marca de tiempo y el tamaño con la marca de tiempo y el tamaño del archivo de destino, y evita copiar si son iguales. (Sin embargo, si está copiando a un cuadro remoto, seguirá habiendo la sobrecarga de conexión).) – Thomas

Respuesta

13

estoy de acuerdo con la respuesta rsync si tiene grandes árboles de archivos para gestionar, pero se puede utilizar la -u (--update) bandera para cp para copiar el archivo (s) sobre sólo si el la fuente es más nueva que el destino.

cp -u

Editar

Puesto que usted ha informado la cuestión para indicar que desea tomar algunas acciones adicionales, tendrá que utilizar el -nt cheque en la [ (test) orden interna:

#!/bin/bash 

if [ $1 -nt $2 ]; then 
    echo "File 1 is newer than file 2" 
else 
    echo "File 1 is older than file 2" 
fi 

Desde la página del manual:

file1 -nt file2 
     True if file1 is newer (according to modification date) than 
     file2, or if file1 exists and file2 does not. 

Espero que ayude.

0

No. Debe utilizar rsync o una de sus interfaces para copiar los archivos, ya que detectará si los archivos son diferentes y solo los copiará si es así.

+5

'rsync' es una sugerencia útil (aunque como puede ver en mi edición, no es exactamente lo que necesito). Pero encuentro tu tono un poco desagradable. –

+1

@Alan H .: Tal vez me esté perdiendo algo, pero no encuentro el tono desagradable en absoluto. De hecho, me sorprendió tu respuesta. –

3

Puede encontrar más confiable detectar cambios en el contenido del archivo comparando el tamaño del archivo (si los tamaños son diferentes, el contenido) y el resumen de los contenidos. Probablemente no importe mucho el hash que usa para este propósito: SHA1 o incluso MD5 es probablemente adecuado, y puede encontrar que el comando cksum es suficiente.

Los tiempos de modificación de archivos pueden cambiar sin cambiar el contenido (piense en touch file); Los tiempos de modificación de archivos no pueden cambiar incluso cuando el contenido lo haga (hacerlo es más difícil, pero puede usar touch -r ref-file file para establecer los tiempos de modificación de file para que coincidan con ref-file después de editar el archivo).

+0

¿Por qué utilizar una comparación hash en lugar de bit por bit? ¿No es la comparación bit a bit más rápida que ejecutar todo el archivo y formar un hash? – Pacerier

+1

@Pacerier: si los archivos son diferentes, la comparación byte a byte podría ser más rápida a menos que el último byte sea el único diferente. Si los archivos son iguales, solo puede mostrar eso comparando todos los bytes. La ventaja de un hash es que puede almacenar el valor anterior del hash (que es relativamente pequeño) y compararlo con el nuevo valor del hash regenerado a partir del archivo actual. Si hay una diferencia, entonces el archivo ha cambiado. Hacer la comparación de byte a byte requiere que el archivo anterior esté presente. –

6

OS X tiene el comando stat. Algo como esto debe darle la fecha de modificación de un archivo:

stat -f '%m' filename 

El equivalente GNU sería:

stat --printf '%Y\n' filename 
Cuestiones relacionadas