GNU/Linux >> Belajar Linux >  >> Linux

Mengatur/mengubah ctime atau Ubah atribut waktu pada file

Saya dapat mengubah waktu dengan dua metode berbeda:

  1. Mengubah kernel menjadi ctime cocok dengan mtime
  2. Menulis skrip shell sederhana (namun hacky).

Metode 1:Mengubah kernel.

Saya men-tweak hanya beberapa baris di KERNEL_SRC/fs/attr.c Modifikasi ini memperbarui waktu agar sesuai dengan waktu setiap kali waktu "ditentukan secara eksplisit".

Ada banyak cara untuk "mendefinisikan secara eksplisit" waktu, misalnya:

Di Linux:

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

Di Jawa (menggunakan Java 6 atau 7, dan mungkin lainnya):

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

Ini adalah perubahan ke KERNEL_SRC/fs/attr.c di notify_change fungsi:

    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) Baris ini, tanpa komentar, akan memperbarui waktu ke waktu jam saat ini setelah ada perubahan pada file. Kami tidak menginginkan itu, karena kami ingin mengatur waktu sendiri. Jadi, kami mengomentari baris ini. (Ini tidak wajib)

(2) Ini benar-benar inti dari solusinya. notify_change fungsi dijalankan setelah file diubah, di mana metadata waktu perlu diperbarui. Jika tidak ada mtime yang ditentukan, maka mtime diatur ke waktu saat ini. Selain itu, jika mtime disetel ke nilai tertentu, kami juga menyetel waktu dan waktu ke nilai tersebut.

Metode ke-2:Skrip shell sederhana (namun hacky).

Penjelasan singkat:

  1. Ubah waktu sistem ke waktu target Anda
  2. Lakukan chmod pada file, waktu file sekarang mencerminkan waktu target
  3. Kembalikan waktu sistem kembali.

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"

Jalankan ini sebagai berikut:./changectime.sh MYFILE

waktu file sekarang akan mencerminkan waktu dalam file.

Tentu saja, Anda mungkin tidak menginginkan file dengan izin 777. Pastikan Anda mengubah skrip ini sesuai kebutuhan sebelum menggunakannya.


Menyesuaikan jawaban ini dengan kasus Anda:

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

Saya ragu kita akan melihat metode yang nyaman di Standard Java API untuk melakukan ini, karena tidak ada Linux (man touch ) atau Windows (GetFileTime berfungsi pada MSDN) memberikan akses mudah ke bidang ini. Panggilan sistem asli hanya memberikan akses ke pembuatan/akses/modifikasi stempel waktu, begitu pula Java.


Linux
  1. Linux – Sistem File Apa di Linux yang Menyimpan Waktu Pembuatan?

  2. Apa Arti Atribut 's' Dalam Izin File ??

  3. Bagaimana Cara Mengubah Izin Pada Satu File?

  1. Stempel Waktu File di Linux:atime, mtime, ctime Dijelaskan

  2. Bagaimana cara mengarahkan output dari perintah waktu ke file di Linux?

  3. Perintah sed Linux tidak mengubah file target

  1. Atur waktu waktu eksekusi beberapa perintah

  2. Bagaimana cara mengubah pengkodean yang digunakan server SFTP saya?

  3. Sistem file apa di Linux yang menyimpan waktu pembuatan?