GNU/Linux >> Znalost Linux >  >> Linux

Nastavení/změna atributu ctime nebo Change time u souboru

Byl jsem schopen upravit ctime dvěma různými metodami:

  1. Změna jádra tak, aby ctime odpovídá mtime
  2. Psaní jednoduchého (ale nešikovného) skriptu shellu.

1. metoda:Změna jádra.

Upravil jsem jen pár řádků v KERNEL_SRC/fs/attr.c Tato úprava aktualizuje ctime tak, aby odpovídal mtime, kdykoli je mtime "explicitně definováno."

Existuje mnoho způsobů, jak „explicitně definovat“ mtime, například:

V Linuxu:

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

V Javě (pomocí Javy 6 nebo 7 a pravděpodobně dalších):

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

Zde je změna na KERNEL_SRC/fs/attr.c v notify_change funkce:

    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) Tento řádek, bez komentáře, aktualizuje ctime na aktuální čas hodin při změně souboru. To nechceme, protože si chceme nastavit ctime sami. Proto komentujeme tento řádek. (Toto není povinné)

(2) Toto je skutečně jádro řešení. notify_change funkce se provede po změně souboru, kde je třeba aktualizovat časová metadata. Pokud nebyl zadán žádný mtime, pak se mtime nastaví na aktuální čas. Jinak, pokud byl mtime nastaven na konkrétní hodnotu, nastavíme na tuto hodnotu také ctime a atime.

2. metoda:Jednoduchý (ale hacknutý) skript shellu.

Stručné vysvětlení:

  1. Změňte systémový čas na cílový čas
  2. Proveďte chmod na souboru, soubor ctime nyní odráží cílový čas
  3. Vraťte systémový čas zpět.

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"

Spusťte to následovně:./changectime.sh MYFILE

Ctime souboru bude nyní odrážet čas v souboru.

Samozřejmě, pravděpodobně nechcete soubor s oprávněními 777. Ujistěte se, že jste tento skript před použitím upravili podle svých potřeb.


Přizpůsobení této odpovědi vašemu případu:

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

Pochybuji, že ve standardním Java API uvidíme vhodnou metodu, jak toho dosáhnout, protože ani Linux (man touch ) ani Windows (GetFileTime funkce na MSDN) umožňují snadný přístup k tomuto poli. Nativní systémová volání poskytují pouze přístup k vytvoření/přístupu/úpravě časových razítek, stejně jako Java.


Linux
  1. Co znamená atribut „s“ v oprávněních k souboru?

  2. Ubuntu – Linux – Čas změny souboru versus čas úpravy?

  3. Soubor Časová razítka v Linuxu:atime, mtime, ctime Vysvětleno

  1. Jak přesměrovat výstup příkazu time do souboru v Linuxu?

  2. Čas provedení více příkazů

  3. Jak změnit kódování, které používá můj SFTP server?

  1. Linux – jaké souborové systémy v systému Linux ukládají dobu vytvoření?

  2. Výstup do Stdout a zároveň Grep do souboru?

  3. Změňte pořadí řádků v souboru