Déterminer si un fichier a été modifié


10

Sous Linux (utilisant actuellement le système de fichiers ext4), comment vérifier rapidement si le contenu d'un fichier a été modifié sans lire aucun de ses contenus?

La statcommande est-elle une approche recommandée? Je fais actuellement

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

et plus tard, je peux vérifier si la même commande donne la même sortie. Si c'est le cas, je conclus que hello.txt n'a pas changé.

Mon sentiment est que l'on veut ajouter plus de paramètres pour être encore plus sûr. Par exemple, l'ajout de la taille du fichier, du nom du fichier, etc., fournirait-il une "empreinte" encore meilleure du fichier?

À ce sujet, je me souviens qu'un volume TrueCrypt que j'avais une fois était toujours ignoré par mon programme de sauvegarde incrémentielle, peut-être parce que TrueCrypt s'est assuré de ne laisser aucun changement de métadonnées. Je suppose qu'il est en effet possible de modifier toutes les données retournées par stat, donc il ne peut pas être garanti de reprendre à chaque modification possible du fichier?


md5sum filename?
Ramesh

md5sumou toute sorte de somme de contrôle lit le contenu du fichier. Je ne veux pas faire ça car c'est beaucoup trop lent pour mes besoins.
DustByte

ls -ttriera le contenu d'un répertoire par heure de modification.
ryekayo

"a été modifié"? Chaque fichier a été modifié, la question est de savoir quand il a été modifié. Vous pouvez utiliser «rechercher» pour rechercher une plage spécifique d'heures de modification.
Ray Andrews

Réponses:


5

Si vous souhaitez détecter si un fichier a été modifié par des moyens normaux (le modifier dans une application, extraire une nouvelle version d'un système de contrôle de révision, le reconstruire, etc.), vérifiez si son heure de modification (mtime) est passée de le dernier chèque. C'est ce que stat -c %Yrapporte.

L'heure de modification peut être réglée par la touchcommande. Si vous souhaitez détecter si le fichier a changé de quelque manière (y compris l'utilisation de touch, extraire une archive, etc.), vérifiez si son temps de changement d'inode ( ctime ) a changé depuis la dernière vérification. C'est ce que stat -c %Zrapporte. Le ctime ne peut être usurpé que par l'administrateur système (et même alors, uniquement par des moyens indirects: en changeant l'horloge du système, ou en accédant directement au disque, en contournant le système de fichiers).


Merci, je suppose que ctime est ce que je dois utiliser. Il ne découle pas de ma question que le but de ceci est de l'utiliser dans mon propre script de sauvegarde, où les sommes de contrôle seront calculées uniquement pour les nouveaux fichiers ou les fichiers qui ont changé. Je peux me permettre de calculer des sommes de contrôle pour les fichiers qui ont changé juste "légèrement", disons que les autorisations ont changé, etc. Je préfère être aussi proche que possible de regarder réellement le contenu du fichier pour déterminer un changement.
DustByte

3

La commande stat n'a qu'une résolution d'une seconde. Donc, si le fichier a été modifié deux fois dans la même seconde, vous pourriez manquer une modification. Les systèmes de fichiers plus récents comme ext4 fournissent des horodatages de résolution plus élevée en nanosecondes, mais certains des anciens outils n'ont pas encore rattrapé leur retard.

Il est également possible pour d'autres programmes de définir une heure de modification arbitraire. Vous pouvez voir comment cela peut se produire via la commande tactile.

Si vous êtes préoccupé par l'une de ces deux possibilités, ce ne serait pas une mauvaise idée de regarder également la taille du fichier. C'est ce que fait rsync lorsqu'il recherche des fichiers modifiés.


1

Mon sentiment est que l'on veut ajouter plus de paramètres pour être encore plus sûr.

Ce que vous avez, c'est la bonne méthode. La seule raison de l'échec serait que le système de fichiers ne se met pas à jour correctement - auquel cas vous vous retrouverez avec tout un tas de problèmes plus graves.

Bien sûr, je suppose qu'une personne possédant les bonnes connaissances et un accès root à un système où la partition est accessible pourrait être en mesure de modifier les informations pour donner l' impression que le fichier n'a pas été modifié. Cependant, dans ce cas, ils se seraient sûrement assurés de faire de même avec la taille, etc.


0

Je rends l'empreinte plus détaillée.

J'ai créé une petite fonction wrapper qui génère une sortie identique pour les versions MacOS / BSD et GNU de stat(détecte également la version installée par Homebrew avec un gpréfixe).

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 initfonction est appelée une fois lors de l'initialisation du script et getFileStatuspeut être appelée à plusieurs reprises sans surcharge de détection.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.