我能够用两种不同的方法来修改的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