在UNIX系统中重命名文件但保留原始创建和修改时间

5
有没有办法在保留原始创建/修改/读取时间的同时重命名文件?这是在Solaris中发生的情况。提前感谢您。
4个回答

9

我认为你不能使用mv来做到这一点。但是,你可以使用cp -p来实现;将文件复制到一个新名称,然后删除原始文件。 -p标志会保留时间戳。

但是你会得到一个新的inode……而这是使用mv不会发生的。


谢谢你,回答非常快。 - eboni

2
在其他人提出的主题变化中:
cp -al "$oldname" "$newname"
unlink "$oldname"

只要$oldname和$newname在同一挂载点(文件系统)上,就应该避免任何复制。


你很幸运。

Solaris(带有ZFS)是极少数实际为文件保留创建时间属性的文件系统之一。

现在回到主题:不,你不能保留所有时间:inode会改变,文件名也会改变。这意味着inode ctime将按照(POSIX)定义更改。

除非你运行noatime挂载点(zfs set atime = off),否则最后访问时间也会更改。

我认为没有办法改变这个。然而,文件创建日期时间应该完全不会改变。 我本来要展示显示创建时间的命令,但不幸的是,我手头没有Solaris盒子,而且我似乎找不到它。我想你最好是man ls find stat

祝好运


1

你可以使用cp -p,然后删除原始文件。


谢谢你,回答得真快。 - eboni
2
@user185572 这会有性能影响。如果文件很大,你可能需要记录时间,然后使用 touch(1) 将它们改回来。 - cnicutar

0

touch命令可以强制修改文件的修改时间,但我不确定它是否适用于ZFS。如果您正在重命名大文件,则此方法比cp -p更低开销。以下是一个bash脚本:

oldFileTime=`find "$1" -maxdepth 0 -printf "%Ty%Tm%Td%TH%TM.%.2TS"`
mv "$1" "$2"
touch -t "$oldFileTime" "$2"

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接