无法在Python中使用xattr设置MacOS查找注释元数据



作为大型Python项目的一部分,希望在查找器中可见特定于文件的注释。所以,我试着用Python 3.8.2在Big Sur上运行,为4500个文件设置finder注释。我已经使用osxmetadata包实现了这一点,但它需要2-3分钟,大概是因为调用了AppleScript。

Python可以单独使查找器注释保持不变吗?如果可以,如何保持不变?或者,如果你必须在Python之外使用,有没有比运行一个Applescript 4500次更有效的方法?

使用xattr并不能达到这个目的。下面的代码成功地将扩展属性设置为与Get Info或osxmetadata相同的值。但是字符串/注释没有反映在查找器中。

import xattr
import plistlib
from plistlib import FMT_BINARY
file = 'test.json'
bplist = plistlib.dumps('Hello World', fmt=FMT_BINARY)
xattr.setxattr(file, 'com.apple.metadata:kMDItemFinderComment', bplist)

终端的结果:

% xattr -pl com.apple.metadata:kMDItemFinderComment test.json
0000   62 70 6C 69 73 74 30 30 5B 48 65 6C 6C 6F 20 57    bplist00[Hello W
0010   6F 72 6C 64 08 00 00 00 00 00 00 01 01 00 00 00    orld............
0020   00 00 00 00 01 00 00 00 00 00 00 00 00 00 00 00    ................
0030   00 00 00 00 14                                     .....

进一步的调查显示,目录的. ds_store文件没有改变。所以,我想我只是改变了"聚光灯评论"而不是"发现者评论"(?)。我想只是为我的各种目录写一个新的。ds_store文件,但这似乎是不可能的。

任何关于Python或混合解决方案的想法都将受到赞赏。谢谢!

我做了一些实验,似乎调用osascript有相当大的开销,所以最好避免对您的4,000个文件中的每个文件调用一次。

我发现以下代码在7秒内运行了1000个名为f-1,f-2等的文件:

#!/bin/bash
osascript <<EOF
repeat with i from 1 to 1000
set fName to "/Users/mark/f-" & i as string
set fName to (fName as POSIX file)
tell application "Finder" to set comment of item fName to "Freddy frog"
end repeat
EOF

然而,如果您像这样为每个文件创建一个新的osascript,则需要超过2分钟:

# This takes over 2 minutes with 1000 files
for f in f* ; do
filename=$(realpath "$f")
osascript <<EOF
tell application "Finder" to set comment of item POSIX file "$filename" to "Filename=$filename"
EOF
done

如果你的文件名不是按顺序排列的,你可以沿着这些行列一个列表,或者从你在应用程序中其他地方创建的文件中读取文件名:

osascript <<EOF
set filelist to {"f-1", "f-2", "f-3"}
repeat with f in filelist
set fName to "/Users/mark/" & f
set fName to (fName as POSIX file)
tell application "Finder" to set comment of item fName to "Freddy frog"
end repeat
EOF
exit

最新更新