Следуя предложению Марка Плотника о преобразовании структурированного XML-вывода
diskutil apfs list -plist
в JSON и парсинг с помощью jq
. Утилита jq
доступна в Homebrew для macOS.
Это нужно сделать в два этапа, так как plutil
нужно прочитать обычный файл:
diskutil apfs list -plist >list.xml
plutil -convert json -o list.json list.xml
Из сгенерированного файла JSON мы можем извлечь UUID тома APFS всех томов, для которых включен FileVault и которые заблокированы, используя
jq -r '.Containers[].Volumes[] | select(.FileVault == true and.Locked == true) |.APFSVolumeUUID' list.json
Присвоение этого переменной одной "одной" командой:
locked_uuids=$(
diskutil apfs list -plist >list.xml
plutil -convert json -o list.json list.xml
jq -r '.Containers[].Volumes[] | select(.FileVault == true and.Locked == true) |.APFSVolumeUUID' list.json
rm -f list.xml list.json
)
Обратите внимание, что приведенная выше команда перезаписывает и удаляет два файла list.xml
и list.json
в текущем каталоге. Вы можете создать временные файлы, используя mktemp
вместо :
.
locked_uuids=$(
tmpxml=$(mktemp)
tmpjson=$(mktemp)
diskutil apfs list -plist >"$tmpxml"
plutil -convert json -o "$tmpjson" "$tmpxml"
jq -r '.Containers[].Volumes[] | select(.FileVault == true and.Locked == true) |.APFSVolumeUUID' "$tmpjson"
rm -f "$tmpxml" "$tmpjson"
)
И для удобства вы можете поместить эти команды в функцию оболочки и вызвать ее вместо (, используя bash
здесь):
list_locked_vaults () {
local tmpxml=$(mktemp)
local tmpjson=$(mktemp)
diskutil apfs list -plist >"$tmpxml"
plutil -convert json -o "$tmpjson" "$tmpxml"
jq -r '.Containers[].Volumes[] | select(.FileVault == true and.Locked == true) |.APFSVolumeUUID' "$tmpjson"
rm -f "$tmpxml" "$tmpjson"
}
locked_uuids=$( list_locked_vaults )