设置创建或更改时间戳

时间:2010-12-27 07:45:31

标签: linux timestamp posix

使用utimesfutimesfutimens等,可以在文件上设置访问和修改时间戳。

修改时间是文件数据最后一次更改。同样,“ctime”或更改时间是最后一次更改文件上的属性(如权限)。 (Linux / POSIX维护三个时间戳:mtime和ctime,已经讨论过,'atime'或访问时间。)

是否有设置更改时间戳的功能? (其中“更改”是属性修改或'ctime',修改时间'mtime'。)(我理解想要更改更改时间戳的循环性质,但想想归档软件 - 它会很高兴能够完全恢复文件。)

创建时间戳是否有任何功能? (我意识到ext2不支持这一点,但我想知道Linux是否适用于那些支持它的文件系统。)

如果不可能,那背后的原因是什么呢?

5 个答案:

答案 0 :(得分:20)

对于ext2/3以及ext4,您可以使用debugfs工具执行此操作,假设您要更改位于的ctime文件/tmp/foo磁盘/dev/sda1我们要将ctime设置为201001010101,这意味着2010年1月1日,时间01:01:

警告:必须在此操作之前卸载磁盘

# Update ctime
debugfs -w -R 'set_inode_field /tmp/foo ctime 201001010101' /dev/sda1

# Drop vm cache so ctime update is reflected
echo 2 > /proc/sys/vm/drop_caches

Command Line Kung Fu博客获取的信息。

答案 1 :(得分:8)

我有类似的问题,并在这里写了我的答案。

https://stackoverflow.com/a/17066309/391040

基本上有两种选择:

  1. 内核略有变化(链接中包含的代码)
  2. 将系统时钟更改为所需的ctime,触摸文件,然后恢复当前时间。 (链接中包含的shell脚本)。

答案 2 :(得分:5)

根据http://lists.gnu.org/archive/html/coreutils/2010-08/msg00010.html ctime不能伪造(至少它不是假的):

  

POSIX说atime和mtime是用户可以设置的任意时间   通过系统调用的utimensat()系列,但ctime 必须   不可思议地跟踪任何改变文件的动作的当前时间   元数据或内容。

如果您只是需要更改文件的ctime以进行某些测试/调试,bindfs可能会有所帮助。它是一个FUSE文件系统,它将一个目录安装到另一个地方,并且可以对文件属性进行一些转换。使用选项--ctime-from-mtime,每个文件的ctime与其mtime相同,您可以使用touch -t设置它。

答案 3 :(得分:1)

最简单的方法:

1) change System time
2) copy paste a file on another location.

我在 Windows 7 上尝试了此操作,然后我成功更改了所有三个时间戳。 linux上的stat命令显示所有三个时间戳都已更改。

答案 4 :(得分:0)

下面的脚本自动在 ismail 的答案中为许多文件运行 debugfs ... set_inode_field ... ctime ...。它会将 /media/MYUSER/MYFS/FOO/BAR 中的文件中的 ctime 值(递归地)复制到 /media/MYUSER/MYFS2/FOO/BAR,并卸载 /media/MYUSER/MYFS2 作为副作用。仅当 /media/MYUSER/MYFS2 的文件系统为 ext2、ext3 或 ext4 时才有效(因为 debugfs 仅适用于这些文件系统)。

mydev2="$(df /media/MYUSER/MYFS2 | perl -ne '$x = $1 if !m@^Filesystem @ and m@([^ ]+) @; END { print "$x\n" }')"
cd /media/MYUSER/MYFS
find FOO/BAR -type f | perl -ne 'chomp; my @st = lstat($_); if (@st and -f(_)) { s@"@""@g; print "set_inode_field \"/$_\" ctime \@$st[10]\n" }' >/tmp/sif.out
sudo umount /media/MYUSER/MYFS2  # Repeat until success.
sudo debugfs -w -f /tmp/sif.out /dev/"$mydev2"

它可以正确处理带有空格和特殊字符的文件名。

它独立于时区工作。作为 debugfs 的一个限制,它的精度是秒,它忽略任何更小的东西(例如毫秒、微秒、纳秒)。根据所使用的 debugfs 版本,它可能使用 32 位时间戳,因此它可以正确处理 2038-01-19 之前的日期。

如果当前用户没有足够的 /media/MYUSER/MYFS 读取权限,则应以 root (sudo bash) 身份运行上述命令。