linux 更改ctime_设置/改变ctime或“更改时间”。属性在文件上

I wish to change the timestamp metadata on files in Java using the java.nio.Files class.

I would like to change all 3 Linux/ext4 timestamps (last modified, access, and changed).

I am able to change the first two timestamp fields as follows:

Files.setLastModifiedTime(pathToMyFile, myCustomTime);

Files.setAttribute(pathToMyFile, "basic:lastAccessTime", myCustomTime);

However, I am unable modify the last Change: time on the file. Also, it is concerning that there is no change timestamp mentioned in the documentation. The closest available attribute is creationTime, which I tried without any success.

Any ideas on how to modify the Change: metadata for a file according to a custom timestamp in Java?

Thank you!

解决方案

I was able to modify the ctime with two different methods:

Changing the kernel so that ctime matches the mtime

Writing a simple (but hacky) shell script.

1st Method: Changing the kernel.

I tweaked just a few lines in KERNEL_SRC/fs/attr.c This modification updates the ctime to match the mtime whenever the mtime is "explicitly defined."

There are many ways to "explicitly define" the the mtime, for example:

In Linux:

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

In Java (using Java 6 or 7, and presumably others):

long newModificationTime = TIME_IN_MILLIS_SINCE_EPOCH;

File myFile = new File(myPath);

newmeta.setLastModified(newModificationTime);

Here is the change to KERNEL_SRC/fs/attr.c in the notify_change function:

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) This line, uncommented, would update the ctime to the current clock time upon a change to the file. We don't want that, since we want to set the ctime ourselves. Thus, we comment this line out. (This isn't mandatory)

(2) This is really the crux of the solution. The notify_change function is executed after a file has been changed, where the time metadata needs to be updated. If no mtime was specified, then the mtime is set to the current time. Else, if the mtime was set to a specific value, we also set the ctime and the atime to that value.

2nd method: Simple (but hacky) shell script.

Brief explanation:

1) Change the system time to your target time

2) Perform a chmod on the file, file ctime now reflects target time

3) Revert the system time back.

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"

Run this as follows:

./changectime.sh MYFILE

The file's ctime will now reflect the time in the file.

Of course, you probably don't want the file with 777 permissions. Ensure that you modify this script to your needs before using it.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值