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

发布于 2024-12-20 06:49:14 字数 931 浏览 1 评论 0原文

我正在尝试使用 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更新创建时间。

因此,要将文件名设置为2010年10月1日的ctime和2010年10月2日的mtime:

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

I'm trying to set the filesystem creation time for a file on Mac OS using a ruby script.

On Mac OS X the 'ctime' represents the last time of inode modification rather than the file creation time, thus using ruby's File.utime() to set ctime will not help.

Using this hint [ http://inessential.com/2008/12/18/file_creation_date_in_ruby_on_macs ] I can retrieve a file's creation time:

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

...but any idea on how to set it using ruby?

-- UPDATE --

Okay, I think I can actually do this with File.utime in ruby.

Even though the ctime is technically not used by Mac OS to track file creation time, when you use utime to update the ctime (along with the mtime, which must be simultaneously set) the filesystem appears to magically also update the creation time as per kMDItemContentCreationDate.

So to set filename to a ctime of 1st Oct 2010 and a mtime of 2nd Oct 2010:

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

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

一片旧的回忆 2024-12-27 06:49:14

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

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

另请参阅 Ruby 核心文档

There is a Ruby solution with the method utime. But you will have to set modification time (mtime) and access time (atime) at once. If you want to keep access time you could use:

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

See Ruby core documentation as well.

半边脸i 2024-12-27 06:49:14

所以你肯定有一个纯 Ruby 解决方案可以工作,但由于这是 OS X,你是否反对 exec()system() 并只使用 触摸?就你而言,我几乎更愿意:

system "touch -t YYYYMMDDhhmm /what/ever"

如果除了清晰之外没有其他原因。

So you've definitely got a pure Ruby solution working, but since this is OS X, are you opposed to exec() or system() and just using touch? In your case, I'd almost prefer:

system "touch -t YYYYMMDDhhmm /what/ever"

if for no other reason than clarity.

泪之魂 2024-12-27 06:49:14

这对我来说可以在 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

This works for me to update creation time on OS X 10.11.1:

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

No claims of portability - SetFile is an OS X command (and the man page says it's deprecated with XCode 6, so may not work for very long) - couldn't find another way to do it though, Time.utime didn't update creation time, but only modified and accessed time.

See: https://apple.stackexchange.com/q/99536/65787

指尖凝香 2024-12-27 06:49:14

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

阅读 utimes 的手册页解释了发生的情况:

int
utimes(const char *path, const struct timeval *times);
..
如果 times 为非 NULL,则假定指向两个 timeval 的数组
结构。访问时间设置为第一个元素的值,
修改时间设置为第二个元素的值。为了
支持文件诞生(创建)时间的文件系统(例如 UFS2),
如果第二个元素的出生时间将被设置为第二个元素的值
元素早于当前设置的出生时间。设置两者的出生
time 和修改时间,需要调用两次;第一个设置的
出生时间和设置(可能是较新的)修改的第二个时间
时间。 ...

所以 ctime 只能及时向后更新。

Ruby uses the utimes system call to change the file-times.

Reading the man-page for utimes explains what happens:

int
utimes(const char *path, const struct timeval *times);
..
If times is non-NULL, it is assumed to point to an array of two timeval
structures. The access time is set to the value of the first element,
and the modification time is set to the value of the second element. For
file systems that support file birth (creation) times (such as UFS2), the
birth time will be set to the value of the second element if the second
element is older than the currently set birth time. To set both a birth
time and a modification time, two calls are required; the first to set
the birth time and the second to set the (presumably newer) modification
time. ...

So ctime only get updated backwards in time.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文