是否可以在不改变文件访问时间的情况下更改文件修改时间?
答案1
我找到了一个方法。我使用 GNU stat ( stat (GNU coreutils) 8.19
) 来查看文件的“访问”、“修改”和“更改”时间戳。
chmod u+x
我可以通过对文件执行 a 来更新“更改”时间。 “修改”和“访问”时间戳保持不变。
cat
我可以通过对其执行更新“Access”文件。 “修改”和“更改”时间戳保持不变。
我编写了一个小型 C 程序,它只执行 a 操作open(filename, O_WRONLY);
,将单个字节写入文件描述符,然后close(filedes);
在生成的文件描述符上写入 a 。 stat
显示主题文件的“访问”时间戳没有变化,但“修改”和“更改”时间戳已更新。
这一切都在 Linux 3.5.4 下进行,这是一款最近更新的 Arch Linux 笔记本电脑,位于 Ext4 文件系统上。
小C程序:
#include <stdio.h>
#include <errno.h>
#include <string.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
int
main(int ac, char **av)
{
int fd = open(av[1], O_WRONLY);
if (fd >= 0)
{
char buf[12];
write(fd, buf, 1);
if (close(fd) < 0)
fprintf(stderr, "Problem closing file: %s\n",
strerror(errno));
} else {
fprintf(stderr, "Problem opening \"%s\": %s\n",
av[1], strerror(errno));
}
return 0;
}
答案2
这utime
/utimes
系统调用让您任意设置访问和修改时间。因此,您可以使用stat
该文件,然后utime
仅更改其中之一。从手册页:
姓名
utime, utimes - 更改文件上次访问和修改时间
概要
#include <sys/types.h> #include <utime.h> int utime(const char *filename, const struct utimbuf *times); #include <sys/time.h> int utimes(const char *filename, const struct timeval times[2]);
描述
utime()系统调用将filename指定的inode的访问和修改时间分别更改为时间的actime和modtime字段。
如果 times 为 NULL,则文件的访问和修改时间将设置为当前时间。
在以下情况下允许更改时间戳:进程具有适当的权限,或者有效用户 ID 等于文件的用户 ID,或者 times 为 NULL 并且进程具有文件的写权限。
[……]
答案3
用属性重新挂载FS noatime
,更改文件,然后重新挂载回来。
答案4
包括-m
的参数touch
。默认情况下,该touch
命令同时修改访问时间和修改时间;如果您通过或-a
通过-m
,则仅修改指定的时间。