Determinar si un archivo ha sido modificado

10

En Linux (que actualmente usa el sistema de archivos ext4), ¿cómo se puede verificar rápidamente si el contenido de un archivo se ha modificado sin leer ninguno de sus contenidos?

¿Es el statcomando un enfoque recomendado? Actualmente lo hago

$ stat --format "%Y" hello.txt

y luego puedo verificar si el mismo comando produce el mismo resultado. Si lo hace, concluyo que hello.txt no ha cambiado.

Mi sensación es que uno quiere incluir más parámetros para estar aún más seguro. Por ejemplo, ¿agregar el tamaño del archivo, el nombre del archivo, etc., proporcionaría una "huella digital" aún mejor del archivo?

Sobre este tema, recuerdo que un volumen de TrueCrypt que una vez tuve siempre fue ignorado por mi programa de copia de seguridad incremental, posiblemente porque TrueCrypt se aseguró de no dejar atrás ningún cambio de metadatos. Supongo que es posible cambiar todos los datos devueltos por stat, por lo tanto, no se puede garantizar que recoja cada posible modificación del archivo.

DustByte
fuente
md5sum filename?
Ramesh
md5sumo cualquier tipo de suma de verificación lee el contenido del archivo. No quiero hacer eso, ya que es demasiado lento para mis propósitos.
DustByte
ls -tordenará los contenidos en un directorio por hora de modificación.
ryekayo
"ha sido modificado"? Cada archivo ha sido modificado, la pregunta es cuándo se modificó. Puede usar 'buscar' para buscar un rango específico de tiempos de modificación.
Ray Andrews

Respuestas:

5

Si desea detectar si un archivo ha sido modificado por medios normales (editándolo en alguna aplicación, revisando una nueva versión desde un sistema de control de revisión, reconstruyéndolo, etc.), verifique si su tiempo de modificación (mtime) ha cambiado de El último cheque. Eso es lo que stat -c %Yinforma.

El tiempo de modificación puede ser establecido por el touchcomando. Si desea detectar si el archivo ha cambiado de alguna manera (incluido el uso de touch, extraer un archivo, etc.), verifique si su tiempo de cambio de inodo ( ctime ) ha cambiado desde la última verificación. Eso es lo que stat -c %Zinforma. El ctime no puede ser falsificado excepto por el administrador del sistema (e incluso entonces, solo por medios indirectos: cambiando el reloj del sistema o accediendo directamente al disco, sin pasar por el sistema de archivos).

Gilles 'SO- deja de ser malvado'
fuente
Gracias, entiendo que ctime es lo que debería usar. No se deduce de mi pregunta que el propósito de esto es usarlo en mi propio script de respaldo, donde las sumas de verificación se computarán solo para los nuevos archivos o archivos que han cambiado. Puedo darme el lujo de calcular sumas de comprobación para archivos que han cambiado "ligeramente", por ejemplo, los permisos han cambiado, etc. Prefiero estar lo más cerca posible de mirar el contenido del archivo para determinar un cambio.
DustByte
3

El comando stat solo tiene una resolución de un segundo. Entonces, si el archivo se modificó dos veces en el mismo segundo, podría perderse una modificación. Los sistemas de archivos más nuevos como ext4 proporcionan marcas de tiempo de mayor resolución en nanosegundos, pero algunas de las herramientas antiguas aún no se han puesto al día.

Además, es posible que otros programas establezcan un tiempo de modificación arbitrario. Puede ver cómo puede suceder esto mediante el comando táctil.

Si le preocupa cualquiera de esas dos posibilidades, no sería una mala idea mirar también el tamaño del archivo. Esto es lo que hace rsync cuando busca archivos modificados.

Steve Sether
fuente
1

Mi sensación es que uno quiere incluir más parámetros para estar aún más seguro.

Lo que tienes es el método correcto. La única razón para que eso falle es si el sistema de archivos no se actualiza correctamente, en cuyo caso terminará con un montón de problemas más serios.

Por supuesto, supongo que alguien con el conocimiento adecuado y el acceso raíz a un sistema donde se puede acceder a la partición podría alterar la información para que parezca que el archivo no ha cambiado. Sin embargo, en este caso seguramente se habrían asegurado de hacer lo mismo con el tamaño, etc.

encerrada dorada
fuente
0

Hago la huella digital más detallada.

Hice una pequeña función de contenedor que genera una salida idéntica para las versiones de MacOS / BSD y GNU de stat(también detecta la versión instalada de Homebrew con un gprefijo).

init() {
  if command -v gstat > /dev/null; then
    # GNU coreutils with g prefix.
    statCmdArgs=("gstat" "--format=%n %s %b %u %g %i %h %Y %Z %W %o");
  elif ! stat --version > /dev/null 2> /dev/null; then
    # MacOS/BSD stat
    statCmdArgs=("stat" "-f" "%N %z %b %u %g %i %l %m %c %B %k");
  else
    # Assume GNU version without prefix.
    statCmdArgs=("stat" "--format=%n %s %b %u %g %i %h %Y %Z %W %o");
  fi;
}

getFileStatus() {
  "${statCmdArgs[@]}" "$1";
}

La initfunción se llama una vez durante la inicialización del script y getFileStatusse puede llamar repetidamente sin la sobrecarga de detección.

devstuff
fuente