Удаление элемента словаря Plist по ключу заголовка из сценария оболочки

334
Chris White

Я пытаюсь создать сценарий оболочки, который удалит папку верхнего уровня из закладок 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 

Но я не нашел правильный синтаксис - если это вообще возможно - удалить по названию с помощью одной из этих утилит, и я не нашел другой утилиты командной строки, которая может это сделать.

В качестве альтернативы, я не привязан к двухэтапному процессу:

  1. Запросите файл plist, чтобы найти заголовок и номер индекса возврата.
  2. Удалить по номеру индекса, как указано выше.

Я не уверен, с чего начать, хотя, и я почти уверен PlistBuddy, plutilи у defaults readменя нет возможности искать, считать и возвращать значение для меня.

Спасибо, любые рекомендации будут с благодарностью, я искал и тестировал методы в течение последних нескольких часов без какой-либо удачи.

1

0 ответов на вопрос