使用utimes
,futimes
,futimens
等,可以在文件上设置访问和修改时间戳。
修改时间是文件数据最后一次更改。同样,“ctime”或更改时间是最后一次更改文件上的属性(如权限)。 (Linux / POSIX维护三个时间戳:mtime和ctime,已经讨论过,'atime'或访问时间。)
是否有设置更改时间戳的功能? (其中“更改”是属性修改或'ctime',不修改时间'mtime'。)(我理解想要更改更改时间戳的循环性质,但想想归档软件 - 它会很高兴能够完全恢复文件。)
创建时间戳是否有任何功能? (我意识到ext2
不支持这一点,但我想知道Linux是否适用于那些支持它的文件系统。)
如果不可能,那背后的原因是什么呢?
答案 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
基本上有两种选择:
答案 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
) 身份运行上述命令。