Mac OS X 10.7 Lionで「追加日」メタデータを設定する方法


22

Mac OS X 10.7 LionのFinderには、アイテムがフォルダに追加された日付を追跡する新しいファイルメタデータの「Date Added」が表示されます。10.7にアップグレードした後、~/Downloadsフォルダー内のどのアイテムにも「追加日」の値がありません。すべての空の「追加日」の値を「変更日」の値と一致するように設定したいのですが、「追加日」属性を特定の値に設定する方法がわかりません。

私の最初の推測はこれでした:

xattr -w com.apple.metadata:kMDItemDateAdded "2012-02-19 16:34:47 +0000" myfile

しかし、それは機能していないようです(ただし、エラーも報告しません)。


解決策を見つけましたか?
erotsppa

1
受け入れられた答えは、私がそれを試してみたときに機能しました(それはまるで狂っています)。
ジョンシラクーサ

回答:


7

OK、ここで新しいアプローチ。注意:Lionにシステムをアップグレードしていません(Lionがインストールされたコンピューターが付属しています)ので、これをテストすることはできません。テストされていないコード。このコードを試す前にバックアップしてください!

以前の回答は、Dockのダウンロードスタックで使用された並べ替え順序に基づいていました。Finderの「追加日」フィールドは、ハッキングするのが難しいSpotlight情報に基づいているようです。AppleScriptからもアクセスできません。しかし、回避策があるようです。

  1. Automatorで新しいワークフローを作成します。

  2. 「Finderアイテムを要求」アクションを追加して、Finderからファイルまたはフォルダーを受け入れるようにワークフローを設定します。

  3. 「Run AppleScript」アクションを追加して、ワークフローでAppleScriptを実行します。

このAppleScriptを使用します。

on run {input, parameters}
    do shell script "sudo /usr/sbin/systemsetup -setusingnetworktime Off" with administrator privileges
    tell application "Finder"
        repeat with x in input
            set myfile to POSIX path of x
            set nm to name of x
            set d to modification date of x
            set yr to (character 3 of (year of d as string)) & (character 4 of (year of d as string))
            set mth to (month of d as number) as string
            if length of mth is 1 then set mth to "0" & mth
            set dy to day of d as string
            if length of dy is 1 then set dy to "0" & dy
            set h to hours of d as string
            if length of h is 1 then set h to "0" & h
            set m to minutes of d as string
            if length of m is 1 then set m to "0" & m
            set s to seconds of d as string
            if length of s is 1 then set s to "0" & s
            set dt to mth & ":" & dy & ":" & yr as string
            set tm to h & ":" & m & ":" & s as string
            do shell script "sudo /usr/sbin/systemsetup -setdate '" & dt & "'" with administrator privileges
            do shell script "sudo /usr/sbin/systemsetup -settime '" & tm & "'" with administrator privileges
            do shell script "mv \"" & myfile & "\" /var/tmp/clobber"
            do shell script "mv /var/tmp/clobber \"" & myfile & "\""
        end repeat
    end tell
    do shell script "sudo /usr/sbin/systemsetup -setusingnetworktime On" with administrator privileges
    return input
end run

追加日がまだないファイルを選択し(Finderで追加日でソートし、追加日なしでリストの一部を選択し)、このサービスを実行します。

Automatorのワークフローのスクリーンショット


2
それはひどい…良い意味で?
ジョンシラクーサ

1
まあ、それは間違いなくハックです。しかし、メタデータの特定の部分はSpotlightから計算されているように見え/.Spotlight-V100ます。しかし、私はきれいな答えを見たいです
ダニエル

このスクリプトから奇妙なエラーが発生していますか?sh:-c行0:一致する `"を
検索

@erotsppaを修正し、今すぐ更新する必要があります。
ダニエル

AppleScript $は、名前に含まれるファイルの処理中にエラーで停止しましたが、一時的にそのファイルの名前を変更することで回避しました。AppleScriptのは、このようなファイルを扱うようにするには、私の検索は、あなたが取り替えることができることを示しているmyfilequoted form of myfile、私はそれをテストしていません。それを試みた場合myfile、変数をに設定して名前を変更するときに引用符を付ける方が明確になる場合がありますquotedFilePath
ロリーオケイン

7

xattr -lダウンロードフォルダー内のアイテムを実行すると、次のようなフィールドが表示されます。

com.apple.metadata:kMDItemDownloadedDate:
00000000  62 70 6C 69 73 74 30 30 A1 01 33 41 B4 83 4D BF  |bplist00..3A..M.|
00000010  4C 4F E3 08 0A 00 00 00 00 00 00 01 01 00 00 00  |LO..............|
00000020  00 00 00 00 02 00 00 00 00 00 00 00 00 00 00 00  |................|
00000030  00 00 00 00 13                                   |.....|
00000035

これはバイナリplistです。HexFiendを使用してこれらのバイトを含むファイルを作成し(はい、手動で入力しました;雑誌からアセンブラーコードをAppleに入力するように過去から爆発します] [GS)、それを.plistファイルとして保存し、開きましたTextWranglerのファイルと、次の未コンパイルのxmlを取得しました。

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<array>
    <date>2011-11-28T05:03:59Z</date>
</array>
</plist>

つまり、Appleは日付をコンパイル済みXMLに保存しているように見えますが、プレーンテキストは機能しているようです。

つまり、ファイルの変更日を文字列形式で取得できる場合、コマンドxattr -w com.apple.metadata:kMDItemDownloadedDate "2012-02-19 16:34:47 +0000" fileを実行して「ダウンロード日」を変更できます。「ダウンロード日」は、実際に追加された日付ではなく、実際にソートされたフィールドのように見えます。

最後に、(未使用)kMDItemDateAddedフィールドを追加してもエラーは発生しませんでした。これは、この記事で学んだxattrように、使用済みまたは未使用のメタデータフィールドを喜んで設定するためです。

それが答えの中核です。AppleScriptを作成して各ファイルの変更日を取得し、kMDItemDownloadedDate設定されているかどうかを確認し、設定されていない場合はkMDItemDownloadedDateを変更日に設定しますが、回答のコアを投稿したかったのです。


1
Downloadsフォルダー内のファイルでmdlsを実行すると、kMDItemDateAdded値が表示されます。これが、Finderのリストビューの「追加日」列に表示されるものです。
ジョンシラクーサ

ちなみに、HexFiendとTextWranglerを経由せずにkMDItemDownloadedDateをplist情報として表示する場合は、を試してくださいxattr -p com.apple.metadata:kMDItemDownloadedDate FILENAME_HERE | xxd -r -p | plutil -convert xml1 - -o -。xxdはバイナリplistデータにplutil変換してから、XML plistに変換して出力します。
マットギブソン

OK、私は頭の上にいます、私は言うのが怖いです。kMDItemDateAddedはにリストされておらずxattr -l、kMDItemDownloadedDateはにリストされていませんmdls。好奇心and盛です。また、ディレクトリの xattrに追加された日付追加フィールドもありません。このメタデータはどこにありますか?
ダニエル

1
以来xattrPythonスクリプトで、私はあなたがそれをdirecty養うことができるように、というよりも進、バイナリ属性のバイナリデータを取得する方法を、このスクリプトと図につつくことが可能であるべきであると思いますplutil
ハラルドハンシュオルセン

4

Finderに表示される「追加日」を設定する方法が見つかりません。

SpotlightインデックスのkMDItemDateAddedメタデータ属性から取得されたことは正しいと思います。ただし、Spotlightは何らかの方法でこれを導き出しているようです。

私はと呼ばれる拡張ファイル属性の設定しようとしたcom.apple.metadata:kMDItemDateAddedフォーマットで使用されるなど、いくつかの異なる形式のいずれかで日付値に、kMDItemDateAddedそしてそれらのどれもが、スポットライトインデックスによってピックアップされなかったが、つまり無価値がで示されるかは重要でxattr、値で示されmdlsたものは変更されませんでした。

私はだろうと思い、私はそれがインデックススポットライトは、単に最初の時間に基づいて、この日付を設定することを、確実に特定の場所にファイルを知らないし、それを生成するために、他のメタデータをチェックしませんが、。あなたの場合はmvダウンロードのうち、ファイルやバックで、日付は、それがバックに移動されたときに更新を追加しましたが、どれものファイルメタデータは、唯一のスポットライトのメタデータに影響を与えたようです。

したがって、要約すると、Date Addedは/.Spotlight-V100のかなり不可解な内臓のどこかにのみ格納されているとみなし、誰かがSpotlightにメタデータエントリを任意の値に更新する方法を考え出すことができない限り、これを行う方法を参照してください。


スポットライト!よくやった。
ダニエル

4

解決策を提供してくれたダニエル・ローソンに感謝します!2年後でも、それはまだうまくいきます。

私は2つの追加があります:

1)受け入れられた回答のコードに小さな誤りがあることに注意してください。

この行:

do shell script "/usr/sbin/systemsetup -settime ''" & tm & "'"

...余分なアポストロフィがあり、「予期しないEOF」エラーをトリガーします。次のようになります。

do shell script "/usr/sbin/systemsetup -settime '" & tm & "'"

2)さらに重要なことは、Mavericks 10.9.2以降、systemsetupには管理者権限が必要です。したがって、シェルスクリプトの呼び出しはすべて、次の式に従う必要があります。

do shell script "sudo /usr/sbin/systemsetup -setusingnetworktime Off" with administrator privileges

以下は、AppleScriptの完全に修正されたバージョンで、10.9.3で動作することが確認されています。

on run {input, parameters}
    do shell script "sudo /usr/sbin/systemsetup -setusingnetworktime Off" with administrator privileges

    tell application "Finder"
        repeat with x in input
            set myfile to POSIX path of x
            set nm to name of x

            set d to modification date of x
            set yr to (character 3 of (year of d as string)) & (character 4 of (year of d as string))
            set mth to (month of d as number) as string
            if length of mth is 1 then set mth to "0" & mth
            set dy to day of d as string
            if length of dy is 1 then set dy to "0" & dy
            set h to hours of d as string
            if length of h is 1 then set h to "0" & h
            set m to minutes of d as string
            if length of m is 1 then set m to "0" & m
            set s to seconds of d as string
            if length of s is 1 then set s to "0" & s

            set dt to mth & ":" & dy & ":" & yr as string
            set tm to h & ":" & m & ":" & s as string
            do shell script "sudo /usr/sbin/systemsetup -setdate '" & dt & "'" with administrator privileges
            do shell script "sudo /usr/sbin/systemsetup -settime '" & tm & "'" with administrator privileges

            do shell script "mv \"" & myfile & "\" /var/tmp/clobber"
            do shell script "mv /var/tmp/clobber \"" & myfile & "\""
        end repeat
    end tell

    do shell script "sudo /usr/sbin/systemsetup -setusingnetworktime On" with administrator privileges

    return input
end run

1
Ask Differentへようこそ!回答を書いて他の人の回答を編集する代わりに、改善したい投稿の下にあるこの回答ボタンを編集または改善するをクリックするだけです
GRG

ダニエルの答えは、これらの変更を含めるために編集れました。
ロリーO'Kane
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.