如何在Mac OS上使用ruby设置文件创建时间?

时间:2011-12-08 03:16:22

标签: ruby macos file filesystems ctime

我正在尝试使用ruby脚本在Mac OS上设置文件的文件系统创建时间。

在Mac OS X上,'ctime'代表inode修改的最后一次而不是文件创建时间,因此使用ruby的File.utime()来设置ctime将无济于事。

使用此提示[http://inessential.com/2008/12/18/file_creation_date_in_ruby_on_macs]我可以检索文件的创建时间:

Time.parse(`mdls -name kMDItemContentCreationDate -raw "#{filename}"`)

...但是如何使用ruby设置它?

- 更新 -

好的,我认为 实际上可以在ruby中使用File.utime执行此操作。

即使Mac OS在技术上没有使用ctime来跟踪文件创建时间,但使用utime更新 ctime (以及 mtime ,必须同时设置)文件系统似乎神奇地按照kMDItemContentCreationDate更新创建时间。

所以将 filename 设置为2010年10月1日的ctime和2010年10月2日的mtime:

File.utime(Time.strptime('011010', '%d%m%y'), Time.strptime('021010', '%d%m%y'), filename)

4 个答案:

答案 0 :(得分:12)

有一个方法为utime的Ruby解决方案。但您必须立即设置修改时间(mtime)和访问时间(atime) 。如果您想保留访问时间,可以使用:

File.utime(File.atime(path), modification_time, path)

同样请参阅Ruby core documentation

答案 1 :(得分:3)

所以你肯定有一个纯Ruby解决方案,但由于这是OS X,你反对exec()system()而只是使用touch?在你的情况下,我几乎更喜欢:

system "touch -t YYYYMMDDhhmm /what/ever"

如果没有其他原因而不是清晰。

答案 2 :(得分:2)

这适用于我在OS X 10.11.1上更新创建时间:

system "SetFile -d '#{time.strftime "%m/%d/%Y %H:%M:%S"}' #{file}"

没有可移植性的声明 - SetFile是一个OS X命令(并且手册页说它已被XCode 6弃用,因此可能无法使用很长时间) - 无法找到另一种方法来执行此操作但是,Time.utime并没有更新创建时间,只是修改和访问时间。

请参阅:https://apple.stackexchange.com/q/99536/65787

答案 3 :(得分:0)

Ruby使用utimes系统调用来更改文件时间。

阅读utimes的man-page解释了会发生什么:

INT      utimes(const char * path,const struct timeval * times); .. 如果times为非NULL,则假定它指向两个timeval的数组      结构。访问时间设置为第一个元素的值,      并且修改时间设置为第二个元素的值。对于      支持文件出生(创建)次数的文件系统(如UFS2),.      如果是第二个元素,则将出生时间设置为第二个元素的值      element比当前设置的出生时间早。设置两个出生      时间和修改时间,需要两次通话;第一个设置      出生时间和第二个设置(可能是更新的)修改      时间。 ...

因此ctime只会及时更新。