GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Setzen/Ändern des ctime- oder Change time-Attributs einer Datei

Ich konnte die ctime mit zwei verschiedenen Methoden ändern:

  1. Kernel so ändern, dass ctime stimmt mit mtime überein
  2. Ein einfaches (aber hackiges) Shell-Skript schreiben.

1. Methode:Ändern des Kernels.

Ich habe nur ein paar Zeilen in KERNEL_SRC/fs/attr.c angepasst Diese Änderung aktualisiert die ctime, damit sie mit der mtime übereinstimmt, wann immer die mtime "explizit definiert" wird.

Es gibt viele Möglichkeiten, die mtime "explizit zu definieren", zum Beispiel:

Unter Linux:

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

In Java (unter Verwendung von Java 6 oder 7 und vermutlich anderen):

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

Hier ist die Änderung zu KERNEL_SRC/fs/attr.c im notify_change Funktion:

    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) Diese unkommentierte Zeile würde ctime bei einer Änderung der Datei auf die aktuelle Uhrzeit aktualisieren. Das wollen wir nicht, da wir die ctime selbst setzen wollen. Daher kommentieren wir diese Zeile aus. (Dies ist nicht obligatorisch)

(2) Das ist wirklich der Kern der Lösung. Die notify_change Funktion wird ausgeführt, nachdem eine Datei geändert wurde, wobei die Zeitmetadaten aktualisiert werden müssen. Wenn keine mtime angegeben wurde, wird die mtime auf die aktuelle Zeit gesetzt. Andernfalls, wenn mtime auf einen bestimmten Wert gesetzt wurde, setzen wir auch ctime und atime auf diesen Wert.

2. Methode:Einfaches (aber hackiges) Shell-Skript.

Kurze Erklärung:

  1. Ändern Sie die Systemzeit auf Ihre Zielzeit
  2. Führen Sie einen chmod an der Datei durch, die Datei ctime gibt jetzt die Zielzeit wieder
  3. Setzen Sie die Systemzeit zurück.

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"

Führen Sie dies wie folgt aus:./changectime.sh MYFILE

Die ctime der Datei spiegelt nun die Zeit in der Datei wider.

Natürlich möchten Sie wahrscheinlich nicht die Datei mit 777-Berechtigungen. Stellen Sie sicher, dass Sie dieses Skript an Ihre Bedürfnisse anpassen, bevor Sie es verwenden.


Passen Sie diese Antwort an Ihren Fall an:

// 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");

Ich bezweifle, dass wir dafür in der Standard-Java-API eine bequeme Methode sehen werden, da weder Linux (man touch ) noch Windows (GetFileTime Funktion auf MSDN) ermöglichen einen einfachen Zugriff auf dieses Feld. Native Systemaufrufe geben nur Zugriff auf Erstellungs-/Zugriffs-/Änderungszeitstempel, ebenso wie Java.


Linux
  1. Linux – Welche Dateisysteme unter Linux speichern die Erstellungszeit?

  2. Ausgabe nach Stdout und gleichzeitig Grep in eine Datei?

  3. Was bedeutet das Attribut „s“ in Dateiberechtigungen?

  4. Ubuntu – Linux – Dateiänderungszeit vs. Änderungszeit?

  5. Wie kann die Ausgabe des Zeitbefehls in eine Datei unter Linux umgeleitet werden?

So erhalten Sie das aktuelle Datum und die aktuelle Uhrzeit in Python

So ändern Sie die Zeitzone in Webmail

So ändern Sie das memory_limit in der .htaccess-Datei

So stellen oder ändern Sie die Zeitzone in Linux

So ändern Sie die Konfiguration von u-boot in Yocto

Wie ändere ich die Kodierung, die mein SFTP-Server verwendet?