8

os.utimeMac (Mac OS X 10.6.2、Python 2.6.1 を実行) で変更時刻を正しく設定するのに問題があり/usr/bin/pythonます。これはtouchユーティリティと一致しておらず、Finder の「情報を取得」ウィンドウに表示されるプロパティとも一致していません。

次のコマンド シーケンスを検討してください。プレーン テキストの「作成」時間と「変更」時間は、ファインダーの「情報を取得」ウィンドウに表示される属性を参照します。os.utimeは引数を取ります(filename, (atime, mtime))

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

'created' と 'modified' はどちらも現在の時刻です。

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

「作成」は現在の時刻、「変更」は 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?timeos.statません。

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

'created' と 'modified' はどちらも 2001 年 9 月 8 日のままです。

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

「作成」は 2001 年 9 月 8 日、「変更」は 2017 年 7 月 13 日です。

これが Python の問題なのか、Mac の統計の問題なのかはわかりません。Python シェルを終了して実行すると

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 atimemtimectime

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 がatimeを積極的にリセットすることがあると聞いたことがあります。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の [情報を見る] ウィンドウからの観察と一致しているようです。私の解釈 (他の実験で裏付けられた) は、HFS の作成日は utime によって更新されますが、逆方向にしか移動しない (前方向には決して進まない) というものです。HFS creationDate を新しい値に更新したい場合は、おそらく Mac 固有の API を使用して更新する必要があります。

もう 1 つの注意: [情報を見る]ウィンドウを更新するには、ウィンドウを少し切り替える必要がある場合があります。私のシステムでは、ウィンドウを [情報を見る] ウィンドウに切り替えるか、[情報を見る] ウィンドウから切り替えない限り、表示が自動的に更新されません。

于 2010-03-26T18:52:30.617 に答える
-1

Mac OS は、posix にマップされない追加の属性を維持します。

  • 日付を作成します
  • contentModDate
  • attributeModDate
  • アクセス日
  • バックアップ日

以前は、古い macfs モジュールを介してこれらにアクセスできました。これは、大部分が文書化されておらず、現在も非推奨になっている Carbon モジュールを支持して、ずっと前に非推奨になりました。Carbon.File と Carbon.Folder には必要なものがあると思います。(私は Mac を十分にフォローしていないため、これらの機能の現在の計画が何であるかを知ることができません。おそらく、Carbon は stdlib から取り出されたばかりで、独自に継続します。)

反対票ではなく、探しているものを詳しく説明したコメントが役立つかもしれません

あなたが期待する他の一貫性が正確にはわかりません。Python は posix API を使用しており、Apple ツールは Apple の API を使用しています。それぞれが内部的に一貫しているように見えますが、互いに異なる場合があります。

  • attributeModDate は ctime にマップされます。
  • createDate は、「作成済み」に対して Finder が表示するものです。
  • mtime を createDate より前に変更すると、mac ファイルシステム API は createDate を一致するように変更します。これにより、作成前の明らかな変更の矛盾が防止されます。これは、上記の例から収集できる唯一の一貫性のない動作に対処します。
于 2010-03-26T17:42:33.090 に答える