ファイルの「変更」日を変更するにはどうすればよいですか?

ファイルの「変更」日を変更するにはどうすればよいですか?

ファイルの「変更」日を変更するにはどうすればいいですか? 使用してもtouch機能しません:

$ touch -t 9901010000 テスト;stat テスト
  ファイル: `test'
  サイズ: 0 ブロック: 0 IO ブロック: 4096 通常の空ファイル
デバイス: fe01h/65025d Inode: 11279017 リンク: 1
アクセス: (0644/-rw-r--r--) Uid: ( 1000/ x) Gid: ( 1000/ x)
アクセス: 1999-01-01 00:00:00.000000000 +0100
変更: 1999-01-01 00:00:00.000000000 +0100
変更: 2012-04-08 19:26:56.061614473 +0200
 生年月日: -

答え1

通常の方法では ctime を変更できません。これは設計によるものです。ファイルのメタデータを変更すると、ctime は常に現在のものに更新され、異なる ctime を適用する方法はありません。ファイルの ctime を変更するには、次のいずれかを実行する必要があります。

  • システム時間を、適用したい ctime に設定し、ファイルをタッチして、システム時間をリセットします。
  • カーネルを変更して、ctime を変更するためのインターフェースを追加します。
  • ディスク イメージに直接アクセスし ( などを使用debugfs)、ディスク上のビットを操作します (ファイル システムがマウントされている間は実行しないでください)。

答え2

jw013が指摘したextXに関するSOの質問に対する回答は、マウントされていないディスク:

# Update ctime
debugfs -w -R 'set_inode_field /tmp/foo ctime 201001010101' /dev/sda1

# Drop vm cache so ctime update is reflected
echo 2 > /proc/sys/vm/drop_caches

答え3

$NOW=$(date) && date -s "2030-08-15 21:30:11" && touch file.txt && date -s "$NOW"

https://www.shellhacks.com/fake-file-access-modify-change-timestamps-linux

答え4

メタデータのいずれかが変更されると、ファイルの ctime が更新されます。

$ ls -l x.py
-rw-rw-r--. 1 ignacio ignacio 485 Mar 26  2010 x.py
$ stat -c %z x.py
2010-03-26 11:57:56.237068175 -0400
$ chown ignacio x.py
$ stat -c %z x.py
2012-04-08 15:31:33.682383575 -0400
$ ls -l x.py
-rw-rw-r--. 1 ignacio ignacio 485 Mar 26  2010 x.py

関連情報