我能使用两种不同的方法修改ctime:
- 更改内核,使得
ctime
与 mtime
匹配
- 编写一个简单(但有些hacky)的shell脚本。
第一种方法:更改内核。
我只需要调整 KERNEL_SRC/fs/attr.c
中的几行代码。这个修改会在每次“明确定义” 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);
这是在notify_change
函数中对KERNEL_SRC/fs/attr.c
进行的更改:
now = current_fs_time(inode->i_sb);
if (!(ia_valid & ATTR_ATIME_SET))
attr->ia_atime = now;
if (!(ia_valid & ATTR_MTIME_SET)) {
attr->ia_mtime = now;
}
else {
attr->ia_ctime = attr->ia_mtime;
attr->ia_atime = attr->ia_mtime;
}
(1) 这行代码,如果不注释掉,在文件发生更改时会将ctime更新为当前的系统时间。我们不想要这种情况发生,因为我们希望自己设置ctime。因此,我们注释掉了这行代码。(这不是强制性的)
(2) 这实际上是解决方案的核心。在文件被修改后,执行notify_change
函数来更新时间元数据。如果没有指定mtime,则将其设置为当前时间。否则,如果将mtime设置为特定值,则我们还将ctime和atime设置为该值。
第二种方法:简单(但有点hacky)的shell脚本。
简要说明:
- 更改系统时间为目标时间
- 对文件执行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权限,请在使用之前确保修改此脚本以适应您的需求。