我正在尝试创建一个 shell 脚本,该脚本将使用 Safari 的 Bookmarks.plist 文件按文件夹名称从 Safari 书签中删除顶级文件夹。不幸的是,我发现使用 PlistBuddy 或 plutil 删除字典项的唯一方法是按索引号。
基本结构如下:
<dict>
<key>Children</key>
<array>
<dict> ... history ... </dict>
<dict> ... bookmarks bar ... </dict>
<dict> ... bookmarks menu ... </dict>
<dict> ... reading list ... </dict>
<dict> ... folder 1 ... </dict>
<!-- Delete this item -->
<dict>
<key>Sync</key>
<dict>
<key>Data</key>
<data>...</data>
<key>ServerID</key>
<string></string>
</dict>
<!-- By this key/value -->
<key>Title</key>
<string>Delete This Folder</string>
<key>WebBookmarkType</key>
<string>WebBookmarkTypeList</string>
<key>WebBookmarkUUID</key>
<string>21D71C04-F58B-43ED-B02C-7D9A208CCEC0</string>
</dict>
<dict> ... folder 3 ... </dict>
</array>
<dict>...</dict>
<key>Title</key>
<string></string>
<key>WebBookmarkFileVersion</key>
<integer>1</integer>
<key>WebBookmarkType</key>
<string>WebBookmarkTypeList</string>
<key>WebBookmarkUUID</key>
<string>892D35B5-DD40-418F-83D3-7AB77C2D9C03</string>
</dict>
</plist>
我想删除第一个数组中具有该Title
值的整个字典项Delete This Folder
,因为项和索引号可以随时更改。
我可以通过几种方法按索引成功删除此项,包括:
PlistBuddy:
PlistBuddy -c "delete :Children:5" /Users/myuser/Library/Safari/Bookmarks.plist
plutil:
plutil -remove Children.5 /Users/myuser/Library/Safari/Bookmarks.plist
但是我还没有找到正确的语法(如果可能的话)来使用这些实用程序按标题删除,也没有找到可以执行此操作的其他命令行实用程序。
或者说,我并不反对两步流程:
- 查询plist文件,查找标题并返回索引号。
- 按照上述方法按索引号删除。
虽然我不确定从哪里开始,但我很确定PlistBuddy
,plutil
我defaults read
没有搜索、计算和返回值的功能。
谢谢,任何建议都将不胜感激,过去几个小时我一直在搜索和测试技术,但没有任何运气。