วิธีตั้งค่าเมทาดาทา“ เพิ่มวันที่” ใน Mac OS X 10.7 Lion


22

ตัวค้นหาใน Mac OS X 10.7 Lion แสดงชิ้นส่วนของเมทาดาทาไฟล์ใหม่ "เพิ่มวันที่" ซึ่งติดตามวันที่ที่มีการเพิ่มรายการลงในโฟลเดอร์ หลังจากอัปเกรดเป็น 10.7 ไม่มีรายการใดใน~/Downloadsโฟลเดอร์ของฉันที่มีค่า "เพิ่มวันที่" ฉันต้องการตั้งค่า "เพิ่มวันที่" ที่ว่างทั้งหมดให้ตรงกับค่า "แก้ไขวันที่" แต่ฉันไม่สามารถหาวิธีตั้งค่าแอตทริบิวต์ "เพิ่มวันที่" เป็นค่าเฉพาะ

การเดาครั้งแรกของฉันคือ:

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

แต่ดูเหมือนจะไม่ทำงาน (แม้ว่าจะไม่ได้รายงานข้อผิดพลาดก็ตาม)


คุณพบวิธีแก้ปัญหาหรือไม่?
erotsppa

1
คำตอบที่ได้รับการยอมรับทำงานเมื่อฉันพยายาม (บ้าเหมือนอย่างที่มันเป็น)
John Siracusa

คำตอบ:


7

ตกลงวิธีการใหม่ที่นี่ ข้อควรระวัง: ฉันไม่ได้อัปเกรดระบบเป็น Lion (คอมพิวเตอร์ของฉันติดตั้ง Lion มาแล้ว) ดังนั้นฉันจึงไม่สามารถทดสอบได้ รหัสไม่ได้ทดสอบ; สำรองข้อมูลก่อนลองรหัสนี้!

คำตอบก่อนหน้าของฉันขึ้นอยู่กับลำดับการเรียงที่ใช้โดยสแต็กดาวน์โหลดใน Dock ฟิลด์วันที่เพิ่มใน Finder ดูเหมือนว่าจะขึ้นอยู่กับข้อมูล Spotlight ซึ่งยากต่อการแฮ็ค นอกจากนี้ยังไม่สามารถเข้าถึงได้ผ่าน AppleScript แต่ดูเหมือนจะมีวิธีแก้ปัญหา

  1. สร้างเวิร์กโฟลว์ใหม่ใน Automator

  2. ตั้งค่าเวิร์กโฟลว์ให้ยอมรับไฟล์หรือโฟลเดอร์จาก Finder โดยการเพิ่มการกระทำ“ Ask for Finder items”

  3. ให้เวิร์กโฟลว์เรียกใช้ AppleScript โดยเพิ่มแอคชัน“ Run 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
นั่นช่างน่ากลัว ... ในทางที่ดีบางที
John Siracusa

1
มันเป็นแฮ็คอย่างแน่นอน แต่ดูเหมือนว่าข้อมูลเมตาบางส่วนนั้นคำนวณจากสปอตไลท์และโดยไม่ต้องแฮ็กความลึกลับมืดที่รู้จักกันในชื่อ/.Spotlight-V100นี้อาจจะดีเท่าที่ได้รับ แต่ฉันชอบที่จะเห็นคำตอบที่สะอาด
แดเนียล

ฉันได้รับข้อผิดพลาดแปลก ๆ จากสคริปต์นี้หรือไม่ sh: -c บรรทัดที่ 0: EOF ที่ไม่คาดคิดขณะมองหาการจับคู่ `"
erotsppa

@erotsppa ควรได้รับการแก้ไขและอัปเดตทันที
Daniel

AppleScript หยุดทำงานโดยมีข้อผิดพลาดเมื่อประมวลผลไฟล์ที่มี$ชื่ออยู่ แต่ฉันได้แก้ไขโดยการเปลี่ยนชื่อไฟล์นั้นชั่วคราว เพื่อให้ AppleScript จัดการกับไฟล์เช่นการค้นหาของฉันแสดงว่าคุณสามารถแทนที่myfileด้วยquoted form of myfileแต่ผมไม่ได้ทดสอบว่า หากหนึ่งพยายามว่ามันอาจจะเป็นที่ชัดเจนที่จะทำ quoting เมื่อตั้งและเปลี่ยนชื่อตัวแปรmyfile quotedFilePath
Rory O'Kane

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

นี่คือการวางแผนไบนารี เมื่อฉันใช้ 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
เรียกใช้ mdls บนไฟล์ในโฟลเดอร์ดาวน์โหลดของคุณแล้วคุณจะเห็นค่า kMDItemDateAdded นั่นคือสิ่งที่คอลัมน์ "เพิ่มวันที่" ในมุมมองรายการค้นหา
John Siracusa

อนึ่งถ้าคุณต้องการที่จะแสดงให้เห็นถึงข้อมูล kMDItemDownloadedDate plist โดยไม่ต้องผ่าน HexFiend และ TextWrangler xattr -p com.apple.metadata:kMDItemDownloadedDate FILENAME_HERE | xxd -r -p | plutil -convert xml1 - -o -ลอง xxd แปลงเป็นข้อมูล plist binary แล้วplutilแปลงเป็น plist XML และพิมพ์ออกมา
Matt Gibson

ตกลงฉันอยู่ในหัวของฉันฉันกลัวที่จะพูด kMDItemDateAdded ไม่ได้อยู่ในxattr -lและ kMDItemDownloadedDate mdlsไม่อยู่ในรายการด้วย อยากรู้อยากเห็นและอยากรู้อยากเห็น ไม่เป็นวันที่เพิ่มข้อมูลที่เก็บไว้ใน xattr สำหรับไดเรกทอรี ข้อมูลเมตานี้อยู่ที่ไหน
แดเนียล

1
ตั้งแต่เป็นสคริปต์หลามผมคิดว่ามันควรจะเป็นไปได้ที่จะกระตุ้นรอบในบทนี้และคิดหาวิธีที่จะได้รับข้อมูลไบนารีของแอตทริบิวต์ในไบนารีมากกว่าหกเหลี่ยมเพื่อให้คุณสามารถป้อนโดยตรงได้ที่จะxattr plutil
Harald Hanche-Olsen

4

ฉันไม่พบวิธีตั้งค่า "เพิ่มวันที่" ที่แสดงใน Finder

ฉันเชื่อว่าคุณถูกต้องว่าถูกดึงจากkMDItemDateAddedแอตทริบิวต์ข้อมูลเมตาของดัชนี Spotlight อย่างไรก็ตาม Spotlight ดูเหมือนจะได้มาซึ่งสิ่งนี้เองในบางวิธี

ฉันได้ลองตั้งค่าแอตทริบิวต์ของไฟล์แบบขยายที่เรียกว่าcom.apple.metadata:kMDItemDateAddedค่าวันที่ในหนึ่งในหลาย ๆ รูปแบบรวมถึงรูปแบบที่ใช้โดยkMDItemDateAddedและไม่มีรูปแบบใดที่ถูกเลือกโดยดัชนี Spotlight เช่นไม่ว่าค่าที่แสดงจะxattrเป็นค่าใด แสดงโดยmdlsไม่เปลี่ยน

ฉันเดาว่าแม้ว่าฉันจะไม่ทราบแน่ชัดว่า Spotlight เพียงแค่กำหนดวันที่นี้ตามครั้งแรกที่จัดทำดัชนีไฟล์ในบางตำแหน่งและไม่ตรวจสอบข้อมูลเมตาอื่น ๆ เพื่อสร้าง หากคุณmvเป็นไฟล์ที่ไม่มีการดาวน์โหลดและย้อนกลับไปวันที่เพิ่มจะอัปเดตเมื่อมันถูกย้ายกลับเข้ามา แต่ดูเหมือนว่าข้อมูลเมตาดาต้าของไฟล์จะไม่ได้รับผลกระทบเฉพาะข้อมูลเมตาของ Spotlight เท่านั้น

ดังนั้นโดยสรุปฉันคิดว่าวันที่เพิ่มจะถูกเก็บไว้ที่ไหนสักแห่งในความลับที่ค่อนข้างลับ /.Spotlight-V100 และถ้าไม่มีใครสามารถหาวิธีบอก Spotlight ให้อัปเดตข้อมูลเมตาเป็นค่าโดยพลการฉันสามารถ ' ไม่เห็นวิธีการทำเช่นนี้


ที่น่าสนใจ! ทำได้ดี.
Daniel

4

ขอบคุณ Daniel Lawson สำหรับวิธีการแก้ปัญหา! มันยังใช้งานได้ดีแม้สองปีต่อมา

ฉันมีสองส่วนเพิ่มเติม:

1) โปรดทราบว่ามีข้อผิดพลาดเล็กน้อยในรหัสของคำตอบที่ยอมรับ

สายนี้:

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

... มีเครื่องหมายวรรคตอนพิเศษซึ่งทำให้เกิดข้อผิดพลาด "EOF ที่ไม่คาดคิด" คุณควรอ่าน:

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

2) สำคัญกว่าเริ่มด้วย Mavericks 10.9.2 systemetup ต้องการสิทธิ์ผู้ดูแลระบบ ดังนั้นการเรียกเชลล์สคริปต์ทุกครั้งควรทำตามสูตรนี้:

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
ยินดีต้อนรับสู่ถามที่แตกต่างกัน! แทนการเขียนคำตอบคำตอบแก้ไขคนอื่นเพียงแค่คลิกแก้ไขหรือปรับปรุงคำตอบนี้ปุ่มด้านล่างโพสต์ที่คุณต้องการที่จะปรับปรุง
grg

คำตอบของแดเนียลได้รับการแก้ไขจะรวมถึงการเปลี่ยนแปลงเหล่านี้
Rory O'Kane
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.