8

我无法os.utime正确设置 Mac 上的修改时间(Mac OS X 10.6.2,从 运行 Python 2.6.1 /usr/bin/python)。它与touch实用程序不一致,并且与 Finder 的“获取信息”窗口中显示的属性不一致。

考虑以下命令序列。纯文本中的“创建”和“修改”时间是指在查找器的“获取信息”窗口中显示的属性。提醒一下,os.utime接受 arguments (filename, (atime, mtime))

>>> import os
>>> open('tempfile','w').close()

'created' 和 'modified' 都是当前时间。

>>> os.utime('tempfile', (1000000000, 1500000000) )

'created' 是当前时间,'modified' 是 2017 年 7 月 13 日。

>>> os.utime('tempfile', (1000000000, 1000000000) )

“创建”和“修改”都是 2001 年 9 月 8 日。

>>> os.path.getmtime('tempfile')
1000000000.0
>>> os.path.getctime('tempfile')
1269021939.0
>>> os.path.getatime('tempfile')
1269021951.0

...但是os.path.get?timeandos.stat并没有反映它。

>>> os.utime('tempfile', (1500000000, 1000000000) )

“创建”和“修改”仍然是 2001 年 9 月 8 日。

>>> os.utime('tempfile', (1500000000, 1500000000) )

“创建”是 2001 年 9 月 8 日,“修改”是 2017 年 7 月 13 日。

我不确定这是 Python 问题还是 Mac 统计问题。当我退出 Python shell 并运行时

touch -a -t 200011221234 tempfile

正如预期的那样,修改和创建时间都没有改变。然后我跑

touch -m -t 200011221234 tempfile

并且“创建”和“修改”时间都发生了变化。

有谁知道发生了什么?如何在 mac 上一致地更改修改和创建时间?(是的,我知道在 Unixy 系统上没有“创建时间”。)


运行 Chris Johnsen 脚本的结果:

seth@local:~$ /usr/bin/python timetest.py tempfile 5
initial:
(1269631281.0, 1269631281.0, 1269631281.0, 1269631281, 1269631281, 1269631281)

test: (1000000000, 1000000000)
(1000000000.0, 1000000000.0, 1269631281.0, 1000000000, 1000000000, 1269631281)
(1269631281.0, 1000000000.0, 1269631281.0, 1269631281, 1000000000, 1269631281)

test: (1000000000, 1500000000)
(1000000000.0, 1500000000.0, 1269631286.0, 1000000000, 1500000000, 1269631286)
(1269631286.0, 1500000000.0, 1269631286.0, 1269631286, 1500000000, 1269631286)

test: (1500000000, 1000000000)
(1500000000.0, 1000000000.0, 1269631291.0, 1500000000, 1000000000, 1269631291)
(1269631291.0, 1000000000.0, 1269631291.0, 1269631291, 1000000000, 1269631291)

test: (1500000000, 1500000000)
(1500000000.0, 1500000000.0, 1269631296.0, 1500000000, 1500000000, 1269631296)
(1269631296.0, 1500000000.0, 1269631296.0, 1269631296, 1500000000, 1269631296)

在练习结束时,查找器中可见的“创建”日期是 9/8/01,“修改”日期是 7/13/17。(由于您的建议和我所读到的可能是聚光灯,访问日期大致是“现在”。)在查找器中可见的创建和修改日期仍然没有意义。

4

2 回答 2

5

POSIX atime , mtime , ctime

如果您包含完整的脚本及其实际和预期的输出而不是 REPL 片段,这可能会有所帮助。

import sys, os, stat, time

def get_times(p):
    s = os.stat(p)
    return ( 
        os.path.getatime(p),
        os.path.getmtime(p),
        os.path.getctime(p),
        s[stat.ST_ATIME],
        s[stat.ST_MTIME],
        s[stat.ST_CTIME],
    )

def main(p, delay=1):
    delay = float(delay)
    (a,b) = (1000000000, 1500000000)

    open(p,'w').close()

    print 'initial:'
    print get_times(p)

    for t in [ (a,a), (a,b), (b,a), (b,b) ]:
        print
        print 'test:', t
        os.utime(p,t)
        print get_times(p)
        time.sleep(delay)
        print get_times(p)

main(*sys.argv[1:])

我在我的 10.4 系统上使用cd "$HOME" && python test.py tempfile 5(系统默认 Python 2.3.6 和 MacPorts Python 2.6.4 都给出了相同的结果(当然,省略了初始时间和ctime)):

% python /tmp/test.py tempfile 5
initial:
(1000000000.0, 1000000000.0, 1269629881.0, 1000000000, 1000000000, 1269629881)

test: (1000000000, 1000000000)
(1000000000.0, 1000000000.0, 1269629881.0, 1000000000, 1000000000, 1269629881)
(1000000000.0, 1000000000.0, 1269629881.0, 1000000000, 1000000000, 1269629881)

test: (1000000000, 1500000000)
(1000000000.0, 1500000000.0, 1269629886.0, 1000000000, 1500000000, 1269629886)
(1000000000.0, 1500000000.0, 1269629886.0, 1000000000, 1500000000, 1269629886)

test: (1500000000, 1000000000)
(1500000000.0, 1000000000.0, 1269629891.0, 1500000000, 1000000000, 1269629891)
(1500000000.0, 1000000000.0, 1269629891.0, 1500000000, 1000000000, 1269629891)

test: (1500000000, 1500000000)
(1500000000.0, 1500000000.0, 1269629896.0, 1500000000, 1500000000, 1269629896)
(1500000000.0, 1500000000.0, 1269629896.0, 1500000000, 1500000000, 1269629896)

这似乎是合理的。我想知道你得到了什么。

我听说 Spotlight 有时会因为重新索引更改的文件而主动重置时间。我不希望它重新索引仅经历过 utime()/utimes() 的文件,但我认为这是可能的。要消除 Spotlight 作为可能的并发症,请使用 Spotlight 未索引的位置中的文件(例如 /tmp/testfile)。

在Finder中创建的日期

(在 Finder 的获取信息窗口中显示为“已创建:”)

如果您安装了开发者工具,您可以使用它/Developer/Tools/GetFileInfo来查看 HFS 创建日期。我在每一行之后添加了以下几print get_times(p)行:

sys.stdout.flush()
os.system('/Developer/Tools/GetFileInfo ' + p)

我还更改了迭代以匹配您的初始描述 ( [ (a,b), (a,a), (b,a), (b,b) ])。

结果现在看起来像这样:

% rm /tmp/tempfile; python /tmp/test.py /tmp/tempfile 1
initial:
(1269636574.0, 1269636574.0, 1269636574.0, 1269636574, 1269636574, 1269636574)
file: "/private/tmp/tempfile"
type: ""
creator: ""
attributes: avbstclinmedz
created: 03/26/2010 15:49:34
modified: 03/26/2010 15:49:34

test: (1000000000, 1500000000)
(1000000000.0, 1500000000.0, 1269636574.0, 1000000000, 1500000000, 1269636574)
file: "/private/tmp/tempfile"
type: ""
creator: ""
attributes: avbstclinmedz
created: 03/26/2010 15:49:34
modified: 07/13/2017 21:40:00
(1000000000.0, 1500000000.0, 1269636574.0, 1000000000, 1500000000, 1269636574)
file: "/private/tmp/tempfile"
type: ""
creator: ""
attributes: avbstclinmedz
created: 03/26/2010 15:49:34
modified: 07/13/2017 21:40:00

test: (1000000000, 1000000000)
(1000000000.0, 1000000000.0, 1269636576.0, 1000000000, 1000000000, 1269636576)
file: "/private/tmp/tempfile"
type: ""
creator: ""
attributes: avbstclinmedz
created: 09/08/2001 20:46:40
modified: 09/08/2001 20:46:40
(1000000000.0, 1000000000.0, 1269636576.0, 1000000000, 1000000000, 1269636576)
file: "/private/tmp/tempfile"
type: ""
creator: ""
attributes: avbstclinmedz
created: 09/08/2001 20:46:40
modified: 09/08/2001 20:46:40

test: (1500000000, 1000000000)
(1500000000.0, 1000000000.0, 1269636577.0, 1500000000, 1000000000, 1269636577)
file: "/private/tmp/tempfile"
type: ""
creator: ""
attributes: avbstclinmedz
created: 09/08/2001 20:46:40
modified: 09/08/2001 20:46:40
(1500000000.0, 1000000000.0, 1269636577.0, 1500000000, 1000000000, 1269636577)
file: "/private/tmp/tempfile"
type: ""
creator: ""
attributes: avbstclinmedz
created: 09/08/2001 20:46:40
modified: 09/08/2001 20:46:40

test: (1500000000, 1500000000)
(1500000000.0, 1500000000.0, 1269636578.0, 1500000000, 1500000000, 1269636578)
file: "/private/tmp/tempfile"
type: ""
creator: ""
attributes: avbstclinmedz
created: 09/08/2001 20:46:40
modified: 07/13/2017 21:40:00
(1500000000.0, 1500000000.0, 1269636578.0, 1500000000, 1500000000, 1269636578)
file: "/private/tmp/tempfile"
type: ""
creator: ""
attributes: avbstclinmedz
created: 09/08/2001 20:46:40
modified: 07/13/2017 21:40:00

这似乎与您在Finder的 Get Info 窗口中的观察结果一致。我的解释(由其他实验证实)是 HFS creationDate 由 utime 更新,但它只会向后(从不向前)。如果您想将 HFS creationDate 更新为更新的值,那么您可能必须使用特定于 Mac 的 API 来执行此操作。

另一个注意事项:您可能需要稍微切换窗口才能更新“获取信息”窗口。在我的系统上,它的显示不会自动更新,除非我将窗口切换到“获取信息”窗口或从“获取信息”窗口切换。

于 2010-03-26T18:52:30.617 回答
-1

Mac OS 维护不映射到 posix 的额外属性。

  • 创建日期
  • 内容修改日期
  • 属性修改日期
  • 访问日期
  • 备份日期

您过去可以通过旧的 macfs 模块访问这些,该模块在很久以前就被弃用了,取而代之的是 Carbon 模块,该模块基本上没有文档记录,现在也已弃用。我认为 Carbon.File 和 Carbon.Folder 有你需要的东西。(我对 Mac 的关注不够多,不知道这些功能的当前计划是什么。也许 Carbon 只是从标准库中提取出来的,它会自行继续。)

也许详细说明您正在寻找的内容的评论会有所帮助,而不是投反对票

我不完全确定您期望的其他一致性。Python 使用的是 posix api,而 Apple 工具使用的是 Apple 的 api。每个人似乎在内部是一致的,但它们之间可能会有所不同。

  • attributeModDate 映射到 ctime。
  • createDate 是 Finder 为“已创建”显示的内容
  • 如果将 mtime 更改为早于 createDate,mac 文件系统 api 将更改 createDate 以匹配;这可以防止在创建之前明显修改的不一致。这解决了我可以从上面的示例中收集到的唯一不一致的行为。
于 2010-03-26T17:42:33.090 回答