文件的修改和访问时间?

文件的修改和访问时间?

是否可以在不改变文件访问时间的情况下更改文件修改时间?

答案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,则仅修改指定的时间。

相关内容