如何在Mac OS X 10.7 Lion中设置“添加日期”元数据


22

Mac OS X 10.7 Lion中的Finder显示了一块新的文件元数据“添加日期”,该文件元数据跟踪将项目添加到文件夹的日期。升级到10.7之后,我~/Downloads文件夹中的所有项目都没有“添加日期”值。我想将所有空的“已添加日期”值设置为与“已修改日期”值匹配,但是我不知道如何将“已添加日期”属性设置为特定值。

我的第一个猜测是:

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

但这似乎不起作用(尽管它也没有报告错误)。


您最终找到了解决方案吗?
erotsppa

1
当我尝试它时,可接受的答案有效(尽管如此)。
John Siracusa 2013年

Answers:


7

好的,这里是新方法。警告:我没有将系统升级到Lion(我的计算机安装了Lion),所以我无法对其进行测试。未经测试的代码;在尝试此代码之前先备份!

我之前的答案是基于Dock中“下载”堆栈使用的排序顺序。Finder中的“添加日期”字段似乎基于Spotlight信息,很难破解。也无法通过AppleScript访问。但是,似乎确实有解决方法。

  1. 在Automator中创建一个新的工作流。

  2. 通过添加“向Finder询问项目”操作,将工作流程设置为从Finder接受文件或文件夹。

  3. 通过添加“运行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
好吧,这绝对是一个hack。但是看来,特定的元数据片段是从Spotlight计算出来的,并且没有破解称为的黑暗谜团/.Spotlight-V100,这可能就足够了。但是我喜欢看到一个干净的答案。
丹尼尔

我从此脚本中收到一个奇怪的错误?sh:-c第0行:寻找匹配的`“时出现意外的EOF
erotsppa,2013年

@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
在“下载”文件夹中的文件上运行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并进行打印。
马特·吉布森

好吧,我不敢说。没有列出kMDItemDateAdded,也没有列出xattr -lkMDItemDownloadedDate mdls。越来越好奇。目录的xattr中也不存储“添加日期”字段。元数据存放在哪里?
丹尼尔

1
既然xattr是python脚本,我想应该可以在该脚本中四处摸索,并弄清楚如何以二进制而不是十六进制的形式获取属性的二进制数据,因此可以直接将其提供给plutil
Harald Hanche-Olsen '02

4

我找不到设置Finder中显示的“添加日期”的方法。

我相信您是正确的,它是从Spotlight索引的kMDItemDateAdded元数据属性中检索到的。但是,Spotlight似乎以某种方式派生了这一点。

我尝试com.apple.metadata:kMDItemDateAdded以几种不同的格式之一设置称为日期值的扩展文件属性,包括所使用的格式,kMDItemDateAdded并且Spotlight索引都没有选择它们,即,无论所显示的值是什么xattr,该值所显示的mdls不变。

,尽管我不确定,但Spotlight只是根据它第一次在特定位置索引文件而设置该日期,并且不检查任何其他元数据来生成它。如果您mv将文件从“下载”中移出,然后又将其移回,则“添加日期”将更新为移回时的日期,但是似乎文件中的任何元数据都不会受到影响,只会影响Spotlight元数据。

因此,总而言之,我认为“添加的日期”仅存储在/.Spotlight-V100颇为隐秘的内胆中,除非有人能告诉Spotlight将元数据条目更新为任意值,否则我可以看不到这样做的方法。


聚光灯!做得好。
丹尼尔

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开始,systemsetup需要管理员权限。因此,每次调用shell脚本都应遵循以下公式:

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

Daniel的答案被编辑为包括这些更改。
罗里·奥肯
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.