Festlegen von Metadaten zum Hinzufügen von Datumsangaben in Mac OS X 10.7 Lion

22

Der Finder in Mac OS X 10.7 Lion zeigt die neuen Dateimetadaten "Aufnahmedatum" an, die das Datum protokollieren, an dem ein Element zu einem Ordner hinzugefügt wurde. Nach dem Upgrade auf 10.7 hat keines der Elemente in meinem ~/DownloadsOrdner den Wert "Datum hinzugefügt". Ich möchte alle leeren Werte für "Hinzugefügt am" so festlegen, dass sie mit den Werten für "Geändert am" übereinstimmen, kann jedoch nicht herausfinden, wie das Attribut "Hinzugefügt am" auf einen bestimmten Wert festgelegt wird.

Meine erste Vermutung war:

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

Aber das scheint nicht zu funktionieren (obwohl es auch keinen Fehler meldet).

John Siracusa
quelle
Haben Sie eine Lösung gefunden?
Erotsppa
1
Die akzeptierte Antwort hat funktioniert, als ich es ausprobiert habe (so verrückt es auch ist).
John Siracusa

Antworten:

7

OK, neuer Ansatz hier. Achtung: Ich habe kein auf Lion aktualisiertes System (auf meinem Computer war Lion installiert), daher kann ich dies nicht testen. Ungetesteter Code; sichern Sie, bevor Sie diesen Code ausprobieren!

Meine vorherige Antwort basierte auf der Sortierreihenfolge, die vom Downloads-Stapel im Dock verwendet wurde. Das Feld "Aufnahmedatum" im Finder basiert anscheinend auf Spotlight-Informationen, die schwer zu hacken sind. Es ist auch nicht über AppleScript zugänglich. Es scheint jedoch eine Problemumgehung zu geben.

  1. Erstellen Sie einen neuen Workflow in Automator.

  2. Stellen Sie den Workflow so ein, dass Dateien oder Ordner aus dem Finder akzeptiert werden, indem Sie die Aktion "Nach Finder-Elementen fragen" hinzufügen.

  3. Lassen Sie den Workflow ein AppleScript ausführen, indem Sie die Aktion "AppleScript ausführen" hinzufügen.

Verwenden Sie dieses 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

Wählen Sie die Dateien aus, für die noch kein Aufnahmedatum vorliegt (sortieren Sie nach Aufnahmedatum im Finder, und wählen Sie dann den Teil der Liste ohne Aufnahmedatum aus), und führen Sie diesen Dienst aus.

Screenshot des Workflows in Automator

Daniel
quelle
2
Das ist schrecklich ... auf eine gute Weise vielleicht?
John Siracusa
1
Nun, es ist definitiv ein Hack. Es scheint jedoch, dass ein bestimmtes Stück Metadaten aus Spotlight berechnet wird, und ohne das dunkle Mysterium, das als bekannt ist, zu hacken /.Spotlight-V100, könnte dies so gut sein, wie es nur geht. Aber ich würde gerne eine saubere Antwort sehen.
Daniel
Ich erhalte einen seltsamen Fehler von diesem Skript? sh: -c Zeile 0: Unerwartetes EOF bei der Suche nach passendem ""
erotsppa
@erotsppa sollte jetzt korrigiert und aktualisiert werden.
Daniel
Das AppleScript wurde mit einem Fehler beim Verarbeiten einer Datei gestoppt, die $ihren Namen hatte. Ich habe das jedoch umgangen, indem ich diese Datei vorübergehend umbenannt habe. Um den Apple behandelt solche Dateien zu machen, meine Recherchen zeigen , dass Sie ersetzen könnten myfilemit quoted form of myfile, aber ich habe nicht getestet , dass. Wenn man das versucht, könnte es klarer sein, die Anführungszeichen beim Setzen zu machen myfileund die Variable in umzubenennen quotedFilePath.
Rory O'Kane
7

Wenn ich xattr -lElemente in meinem Downloads-Ordner auswähle, wird ein Feld angezeigt, das ungefähr so ​​aussieht:

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

Dies ist eine binäre Liste. Wenn ich mit HexFiend eine Datei mit diesen Bytes erstelle (ja, ich habe sie manuell eingegeben; sprengen Sie die Vergangenheit wie die Eingabe von Assembler-Code aus einem Magazin in mein Apple] [GS) und speichern Sie sie dann als .plist-Datei, die ich geöffnet habe die Datei in TextWrangler und erhielt die folgende nicht kompilierte 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>

Das heißt, während Apple die Daten in kompiliertem XML zu speichern scheint, scheint Klartext zu funktionieren.

Mit anderen Worten, wenn Sie das Änderungsdatum der Datei in Form einer Zeichenfolge abrufen können, können Sie den Befehl ausführen xattr -w com.apple.metadata:kMDItemDownloadedDate "2012-02-19 16:34:47 +0000" file, um das "Download-Datum" zu ändern, bei dem es sich anscheinend um das Feld handelt, nach dem tatsächlich sortiert wurde, nicht um das tatsächliche hinzugefügte Datum.

Schließlich ist beim Hinzufügen des (nicht verwendeten) kMDItemDateAddedFeldes kein Fehler aufgetreten, da, wie ich in diesem Artikel erfahren habe , xattrdas gewünschte, verwendete oder nicht verwendete Metadatenfeld problemlos festgelegt wird.

Das ist der Kern der Antwort. Ich werde daran arbeiten, ein AppleScript zu schreiben, um das Änderungsdatum für jede Datei zu ermitteln. Überprüfen Sie, ob das Datum kMDItemDownloadedDatefestgelegt ist. Wenn dies nicht der Fall ist, setzen Sie kMDItemDownloadedDate auf das Änderungsdatum, aber ich wollte den Kern der Antwort veröffentlichen.

Daniel
quelle
1
Führen Sie mdls für die Dateien in Ihrem Downloads-Ordner aus und Sie sehen die kMDItemDateAdded-Werte. Das zeigt die Spalte "Datum hinzugefügt" in der Finder-Listenansicht.
John Siracusa
Übrigens, wenn Sie das kMDItemDownloadedDate als Plist-Informationen anzeigen möchten, ohne HexFiend und TextWrangler zu durchlaufen, versuchen Sie es xattr -p com.apple.metadata:kMDItemDownloadedDate FILENAME_HERE | xxd -r -p | plutil -convert xml1 - -o -. Der xxd konvertiert in binäre Plist-Daten, plutilkonvertiert dann in XML-Plist und druckt sie aus.
Matt Gibson
OK, ich bin über meinem Kopf, ich habe Angst zu sagen. kMDItemDateAdded ist nicht in aufgeführt xattr -l, und kMDItemDownloadedDate ist nicht in aufgeführt mdls. Neugieriger und neugieriger. Das Feld "Aufgenommen am" wird auch nicht in einem xattr für das Verzeichnis gespeichert . Wo leben diese Metadaten?
Daniel
1
Da xattres sich um ein Python-Skript handelt, sollte es möglich sein, in diesem Skript herumzustöbern und herauszufinden, wie die Binärdaten des Attributs in binär statt hexadezimal abgerufen werden können, damit Sie es direkt weitergeben können plutil.
Harald Hanche-Olsen
4

Ich kann das im Finder angezeigte "Aufnahmedatum" nicht einstellen.

Ich glaube, Sie haben Recht, dass es aus dem kMDItemDateAddedMetadatenattribut des Spotlight-Index abgerufen wird. Spotlight scheint dies jedoch auf irgendeine Weise selbst abzuleiten.

Ich habe versucht, ein erweitertes Dateiattribut einzurichten, das com.apple.metadata:kMDItemDateAddedzu einem Datumswert in einem von mehreren verschiedenen Formaten aufgerufen wird , einschließlich des von verwendeten Formats, kMDItemDateAddedund keines davon wurde vom Spotlight-Index erfasst, dh unabhängig vom angezeigten Wert und vom xattrWert gezeigt von mdlswurde nicht geändert.

Ich denke , obwohl ich nicht sicher bin, dass Spotlight dieses Datum einfach basierend auf dem ersten Indizieren einer Datei an einem bestimmten Speicherort festlegt und keine anderen Metadaten überprüft, um sie zu generieren. Wenn Sie mveine Datei aus Downloads und wieder in haben, wird das Hinzufügungsdatum zu dem Zeitpunkt aktualisiert, an dem sie wieder in die Datei verschoben wurde, aber keine der Dateimetadaten scheint betroffen zu sein, nur die Spotlight-Metadaten.

Zusammenfassend kann ich also davon ausgehen, dass das hinzugefügte Datum nur irgendwo in den eher kryptischen Eingeweiden von /.Spotlight-V100 gespeichert ist. Wenn jemand nicht die Möglichkeit hat, Spotlight anzuweisen, einen Metadateneintrag auf einen beliebigen Wert zu aktualisieren, kann ich Folgendes tun: Ich sehe keinen Weg, dies zu tun.

Matt Gibson
quelle
Scheinwerfer! Gut gemacht.
Daniel
4

Vielen Dank an Daniel Lawson für die Lösung! Es funktioniert immer noch gut, auch zwei Jahre später.

Ich habe zwei Ergänzungen:

1) Bitte beachten Sie, dass der Code der akzeptierten Antwort einen kleinen Fehler enthält.

Diese Linie:

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

... hat einen zusätzlichen Apostroph, der einen "unerwarteten EOF" -Fehler auslöst. Es sollte lauten:

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

2) Wichtiger ist, dass ab Mavericks 10.9.2 das System-Setup Administratorrechte erfordert. Daher sollte jeder Aufruf eines Shell-Skripts dieser Formel folgen:

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

Hier ist die vollständig modifizierte Version des AppleScript, die für die Arbeit in 10.9.3 bestätigt wurde:

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
John Keller
quelle
1
Willkommen bei Ask Different! Anstatt eine Antwort zu schreiben, um die Antwort einer anderen Person zu bearbeiten, klicken Sie einfach auf die Schaltfläche zum Bearbeiten oder Verbessern dieser Antwort unter dem Beitrag, den Sie verbessern möchten .
grg
Daniels Antwort hat redigiert worden , um diese Änderungen zu schließen.
Rory O'Kane