web-dev-qa-db-fra.com

horodatage, heure de modification et heure de création d'un fichier

Je sais juste que ls -t et ls -f donne un tri différent des fichiers et des sous-répertoires dans un répertoire.

  • Quelles sont les différences entre l'horodatage, l'heure de modification et l'heure de création d'un fichier?
  • Comment obtenir et modifier ces types d'informations par des commandes?
  • En termes de quel type d'informations les gens disent-ils qu'un fichier est "plus récent" que l'autre?
  • Quels types de modification des informations ne rendront pas le fichier différent?

Par exemple, j'ai vu quelqu'un écrire:

Par défaut, le programme rsync cherche uniquement à voir si les fichiers sont de taille et d'horodatage différents. Peu importe le fichier le plus récent, s'il est différent, il est remplacé. Vous pouvez passer l'indicateur '--update' à rsync, ce qui lui fera sauter des fichiers sur la destination s'ils sont plus récents que le fichier sur la source, mais seulement tant qu'ils sont du même type de fichier. Cela signifie que si, par exemple, le fichier source est un fichier normal et la destination est un lien symbolique, le fichier de destination sera écrasé, quel que soit l'horodatage.

Sur une note latérale, le type de fichier ici signifie-t-il uniquement un fichier ordinaire et un lien sim, pas le type tel que pdf, jpg, htm, txt, etc.?

108
Tim

Il existe 3 types de "timestamps":

  • Accès - la dernière fois que le fichier a été lu
  • Modifier - la dernière fois que le fichier a été modifié (le contenu a été modifié)
  • Modifier - la dernière fois que les métadonnées du fichier ont été modifiées (par exemple, les autorisations)

Pour afficher ces informations, vous pouvez utiliser stat qui fait partie des coreutils.

stat vous montrera également quelques informations supplémentaires comme le périphérique, les inodes, les liens, etc.

N'oubliez pas que ce type d'informations dépend fortement du système de fichiers et des options de montage. Par exemple, si vous montez une partition avec l'option noatime, aucune information d'accès ne sera écrite.

Un utilitaire pour modifier les horodatages serait touch. Il existe des arguments pour décider de l'horodatage à modifier (par exemple -a pour le temps d'accès, -m pour l'heure de modification) et pour influencer l'analyse d'un nouvel horodatage donné. Voir man touch pour plus de détails.

touch peut devenir pratique en combinaison avec cp -u ( "copier uniquement lorsque le fichier SOURCE est plus récent que le fichier de destination ou lorsque le fichier de destination est manquant" ) ou pour la création d'un marqueur vide des dossiers.

146
echox

La réponse de echox est valide mais je veux ajouter des informations concernant l'heure de création du fichier.

Prise en charge du système de fichiers

Certains systèmes de fichiers prennent en charge une entrée supplémentaire dans l'inode concernant l'heure de création (ou l'heure de naissance). Je sais que ext4 prend en charge cette fonctionnalité et aussi JFS et BTRFS .

Cependant, la plupart des outils et API n'ont pas encore été mis à jour pour lire ces informations supplémentaires. Donc, même s'il pourrait être là, il n'est pas accessible.

Par exemple, sur Ubuntu 12.04 LTS, j'obtiens ce qui suit pour un fichier que j'ai créé aujourd'hui:

$ echo Just another test > /tmp/mytest
$ sleep 3
$ touch /tmp/mytest
$ sleep 2
$ cat /tmp/mytest > /dev/null
$ stat /tmp/mytest 
[...]
Access: 2012-06-05 13:33:44.279774711 +0200
Modify: 2012-06-05 13:33:34.611893317 +0200
Change: 2012-06-05 13:33:34.611893317 +0200
 Birth: -
$ Sudo debugfs -R 'stat /tmp/mytest' /dev/sda1
[...]
 ctime: 0x4fcdee8e:91e30114 -- Tue Jun  5 13:33:34 2012
 atime: 0x4fcdee98:42b417dc -- Tue Jun  5 13:33:44 2012
 mtime: 0x4fcdee8e:91e30114 -- Tue Jun  5 13:33:34 2012
crtime: 0x4fcdee46:01258f1c -- Tue Jun  5 13:32:22 2012
[...]

Vous pouvez voir que la nouvelle fonction stat a un champ de naissance, bien que la sortie semble incorrecte. Et via debugfs, nous pouvons obtenir les informations (crtime car je suis sur le système de fichiers ext4).

support statx

Il y a maintenant depuis le noyau 4.11 un nouvel appel système statx , en plus d'une meilleure prise en charge de Y2038 ou des systèmes de fichiers réseau, il apporte également quelques fonctionnalités supplémentaires comme btime ou l'heure de naissance ( création) accès. La prise en charge d'ext4 devrait être dans la même version du noyau 4.11.

Des correctifs ont été ajoutés pour prendre en charge ce nouveau syscall dans les versions ultérieures du noyau: par ex. BTRFS et F2FS dans le noyau 4.13, SMB3 dans 4.14, GFS2 dans 4.15, NFS dans 4.16, etc.

La prochaine glibc fournira un appel de fonction pour interroger cette interface (voir Phoronix news about glibc statx support ). Nous pouvons donc nous attendre à une prise en charge de cette fonctionnalité dans l'espace utilisateur très bientôt.

38
Huygens