GNU/Linux >> Linux の 問題 >  >> Linux

ファイルの ctime または Change time 属性の設定/変更

2 つの異なる方法で ctime を変更できました:

<オール>
  • ctime になるようにカーネルを変更する mtime に一致
  • 単純な (ただしハッキーな) シェル スクリプトを作成する
  • 第 1 の方法:カーネルを変更する。

    KERNEL_SRC/fs/attr.c の数行だけ微調整しました この変更により、mtime が「明示的に定義されている」場合は常に、mtime と一致するように ctime が更新されます。

    mtime を「明示的に定義」する方法は多数あります。例:

    Linux の場合:

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

    Java の場合 (Java 6 または 7、およびおそらくその他を使用):

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

    KERNEL_SRC/fs/attr.c への変更は次のとおりです。 notify_change で 関数:

        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) この行は、コメント化されていないため、ファイルが変更されると ctime が現在の時刻に更新されます。 ctime を自分で設定したいので、これは望ましくありません。したがって、この行をコメントアウトします。 (必須ではありません)

    (2) これがソリューションの核心です。 notify_change 関数は、時間メタデータを更新する必要があるファイルが変更された後に実行されます。 mtime が指定されていない場合、mtime は現在の時刻に設定されます。それ以外の場合、mtime が特定の値に設定されている場合は、ctime と atime もその値に設定します。

    2 番目の方法:シンプルな (しかしハッキーな) シェル スクリプト

    簡単な説明:

    <オール>
  • システム時刻を目標時刻に変更する
  • ファイルで chmod を実行すると、ファイルの ctime がターゲット時間を反映するようになりました
  • システム時刻を戻す
  • 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"
    

    これを次のように実行します:./changectime.sh MYFILE

    ファイルの ctime は、ファイル内の時刻を反映するようになりました.

    もちろん、パーミッションが 777 のファイルは必要ないでしょう。このスクリプトを使用する前に、必要に応じて変更してください。


    この回答をあなたのケースに適応させる:

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

    Linux (man touch ) も Windows (GetFileTime 関数) を使用すると、このフィールドに簡単にアクセスできます。ネイティブ システム コールは、タイムスタンプの作成/アクセス/変更へのアクセスのみを提供します。Java もそうです。


    Linux
    1. Linux – Linux上のどのファイルシステムが作成時間を保存しますか?

    2. Stdoutに出力し、同時にGrepをファイルに出力しますか?

    3. ファイルパーミッションの「s」属性はどういう意味ですか?

    1. Ubuntu – Linux –ファイル変更時間と変更時間?

    2. 単一のファイルの権限を変更するにはどうすればよいですか?

    3. Linuxのファイルタイムスタンプ:atime、mtime、ctimeの説明

    1. time コマンドの出力を Linux のファイルにリダイレクトする方法は?

    2. Linux sed コマンドでターゲット ファイルが変更されない

    3. SFTP サーバーが使用しているエンコーディングを変更するにはどうすればよいですか?