GNU/Linux >> Tutoriels Linux >  >> Linux

Définition/modification de l'attribut ctime ou Change time sur un fichier

J'ai pu modifier le ctime avec deux méthodes différentes :

  1. Modification du noyau pour que ctime correspond au mtime
  2. Écrire un script shell simple (mais hacky).

1ère méthode :changer de noyau.

J'ai modifié quelques lignes dans KERNEL_SRC/fs/attr.c Cette modification met à jour le ctime pour qu'il corresponde au mtime chaque fois que le mtime est "défini explicitement".

Il existe de nombreuses façons de "définir explicitement" le mtime, par exemple :

Sous Linux :

touch -m --date="Wed Jun 12 14:00:00 IDT 2013" filename

En Java (en utilisant Java 6 ou 7, et probablement d'autres) :

long newModificationTime = TIME_IN_MILLIS_SINCE_EPOCH;
File myFile = new File(myPath);
newmeta.setLastModified(newModificationTime);

Voici le passage à KERNEL_SRC/fs/attr.c dans le notify_change fonction :

    now = current_fs_time(inode->i_sb);

    //attr->ia_ctime = now;  (1) Comment this out
    if (!(ia_valid & ATTR_ATIME_SET))
        attr->ia_atime = now;
    if (!(ia_valid & ATTR_MTIME_SET)) {
        attr->ia_mtime = now;
    }
    else { //mtime is modified to a specific time. (2) Add these lines
        attr->ia_ctime = attr->ia_mtime; //Sets the ctime
        attr->ia_atime = attr->ia_mtime; //Sets the atime (optional)
    }

(1) Cette ligne, non commentée, mettrait à jour le ctime à l'heure actuelle de l'horloge lors d'une modification du fichier. Nous ne voulons pas cela, car nous voulons définir nous-mêmes le ctime. Ainsi, nous commentons cette ligne. (Ce n'est pas obligatoire)

(2) C'est vraiment le nœud de la solution. Le notify_change La fonction est exécutée après qu'un fichier a été modifié, où les métadonnées de temps doivent être mises à jour. Si aucun mtime n'a été spécifié, le mtime est défini sur l'heure actuelle. Sinon, si le mtime a été défini sur une valeur spécifique, nous définissons également le ctime et le atime sur cette valeur.

2ème méthode :script shell simple (mais hacky).

Brève explication :

  1. Modifier l'heure système à votre heure cible
  2. Effectuez un chmod sur le fichier, le fichier ctime reflète maintenant l'heure cible
  3. Revenir à l'heure système.

changectime.sh

#!/bin/sh
now=$(date)
echo $now
sudo date --set="Sat May 11 06:00:00 IDT 2013"
chmod 777 $1
sudo date --set="$now"

Exécutez ceci comme suit :./changectime.sh MONFICHIER

Le ctime du fichier reflétera désormais l'heure dans le fichier.

Bien sûr, vous ne voulez probablement pas le fichier avec les autorisations 777. Assurez-vous de modifier ce script selon vos besoins avant de l'utiliser.


Adaptant cette réponse à votre cas :

// Warning: Disk must be unmounted before this operation
String disk = "/dev/sda1";
// Update ctime
Runtime.getRuntime().exec("debugfs -w -R 'set_inode_field "+pathToMyFile+" ctime "+myCustomTime+"' "+disk);
// Drop vm cache so ctime update is reflected
Runtime.getRuntime().exec("echo 2 > /proc/sys/vm/drop_caches");

Je doute que nous verrons une méthode pratique dans l'API Java standard pour le faire, car ni Linux (man touch ) ni Windows (GetFileTime fonction sur MSDN) permettent d'accéder facilement à ce champ. Les appels système natifs ne donnent accès qu'à la création/l'accès/la modification des horodatages, tout comme Java.


Linux
  1. Linux - Quels systèmes de fichiers sur Linux stockent l'heure de création ?

  2. Que signifie l'attribut "s" dans les autorisations de fichiers ? ?

  3. Ubuntu – Linux – Temps de changement de fichier versus temps de modification ?

  4. Comment changer l'autorisation sur un seul fichier ?

  5. Horodatages de fichiers sous Linux :atime, mtime, ctime expliqués

Comment obtenir la date et l'heure actuelles en Python

Comment changer le fuseau horaire dans le webmail

Comment changer le memory_limit dans le fichier .htaccess

Comment définir ou modifier le fuseau horaire sous Linux

Quels systèmes de fichiers sous Linux stockent l'heure de création ?

Changer l'ordre des lignes dans un fichier