我能夠用兩種不同的方法來修改的ctime:
- 改變內核,使
ctime
匹配mtime
- 編寫一個簡單的(但哈克)shell腳本。
第一種方法:更改內核。
我調整了幾行KERNEL_SRC/fs/attr.c
此修改更新ctime以匹配mtime,只要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);
這裏是在notify_change
功能的變化KERNEL_SRC/fs/attr.c
:
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設置爲該值。
第二種方法:簡單(但哈克)shell腳本。
簡要說明: 1)更改系統時間到你的目標時間 2)對文件執行在chmod,文件的ctime現在反映目標時間 3)還原系統時間回來。
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權限的文件。確保您在使用該腳本之前根據需要修改此腳本。
在Linux終端中,對於ls輸出,它顯示上次修改時間,您是否嘗試修改它? – 2013-04-21 01:52:17
是的。我使用上面的第一行代碼成功修改了上次修改的時間。 – Eitan 2013-04-21 07:41:17