Determina se un file è stato modificato


10

In Linux (che attualmente utilizza il filesystem ext4), come si può verificare rapidamente se il contenuto di un file è stato modificato senza leggerne il contenuto?

Il statcomando è un approccio raccomandato? Al momento lo faccio

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

e in seguito posso verificare se lo stesso comando produce lo stesso output. In tal caso, concludo che hello.txt non è cambiato.

La mia sensazione è che si voglia inserire più parametri per essere ancora più sicuri. Ad esempio, aggiungendo la dimensione del file, il nome del file, ecc., Fornirebbe una "impronta digitale" ancora migliore del file?

Su questo argomento, ricordo che un volume TrueCrypt che un tempo avevo era stato sempre ignorato dal mio programma di backup incrementale, probabilmente perché TrueCrypt si assicurava di non lasciare alcun cambiamento di metadati. Suppongo che sia davvero possibile modificare tutti i dati restituiti da stat, quindi non si può garantire che raccolga ogni possibile modifica del file?


md5sum filename?
Ramesh,

md5sumo qualsiasi tipo di checksum legge il contenuto del file. Non voglio farlo perché è troppo lento per i miei scopi.
DustByte,

ls -tordinerà i contenuti in una directory in base al tempo di modifica.
Ryekayo,

"è stato modificato"? Ogni file è stato modificato, la domanda è quando è stato modificato. Puoi usare 'trova' per cercare un intervallo specifico di tempi di modifica.
Ray Andrews,

Risposte:


5

Se si desidera rilevare se un file è stato modificato con mezzi normali (modificandolo in alcune applicazioni, verificando una nuova versione da un sistema di controllo di revisione, ricostruendolo, ecc.), Verificare se il suo tempo di modifica (mtime) è cambiato da l'ultimo controllo. Questo è ciò che stat -c %Yriporta.

Il tempo di modifica può essere impostato dal touchcomando. Se si desidera rilevare se il file è stato modificato in qualche modo (incluso l'uso touch, l'estrazione di un archivio, ecc.), Verificare se il tempo di cambio dell'inode ( ctime ) è cambiato dall'ultimo controllo. Questo è ciò che stat -c %Zriporta. Il ctime non può essere falsificato se non dall'amministratore di sistema (e anche in questo caso, solo attraverso mezzi indiretti: cambiando l'orologio di sistema o accedendo direttamente al disco, bypassando il filesystem).


Grazie, ho capito che ctime è ciò che dovrei usare. Dalla mia domanda non è seguito che lo scopo di questo è usarlo nel mio script di backup, in cui i checksum verranno calcolati solo per i nuovi file o file che sono stati modificati. Posso permettermi i checksum di calcolo per i file che sono cambiati solo "leggermente", ad esempio i permessi sono cambiati, ecc. Preferisco essere il più vicino possibile a guardare effettivamente il contenuto del file per determinare una modifica.
DustByte,

3

Il comando stat ha solo una risoluzione di un secondo. Quindi, se il file è stato modificato due volte nello stesso secondo, potresti perdere una modifica. I filesystem più recenti come ext4 forniscono timestamp a risoluzione più elevata in nanosecondi, ma alcuni dei vecchi strumenti non hanno ancora raggiunto.

Inoltre, è possibile che altri programmi impostino un tempo di modifica arbitrario. Puoi vedere come ciò può avvenire tramite il comando touch.

Se sei preoccupato per una di queste due possibilità, non sarebbe una cattiva idea guardare anche le dimensioni del file. Questo è ciò che fa rsync quando cerca file modificati.


1

La mia sensazione è che si voglia inserire più parametri per essere ancora più sicuri.

Quello che hai è il metodo corretto. L'unico motivo per cui ciò fallirebbe se il filesystem non si aggiorna correttamente, nel qual caso finirai con un sacco di problemi più seri.

Certo, presumo che qualcuno con le giuste conoscenze e l'accesso root a un sistema in cui la partizione è accessibile potrebbe essere in grado di modificare le informazioni per far sembrare che il file non sia stato modificato. Tuttavia, in questo caso avrebbero sicuramente fatto lo stesso con le dimensioni, ecc.


0

Rendo l'impronta digitale più dettagliata.

Ho realizzato una piccola funzione wrapper che genera un output identico per entrambe le versioni MacOS / BSD e GNU stat(rileva anche la versione installata in Homebrew con un gprefisso).

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 initfunzione viene chiamata una volta durante l'inizializzazione dello script e getFileStatuspuò essere richiamata ripetutamente senza l'overhead di rilevamento.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.