如何在终端中读取 PLIST 文件中的特定值

How to read a specific value in PLIST file in terminal

我正在尝试访问 MAC OS 上的 plist 文件中的特定 属性,但 属性 的名称有一个 space 在里面,我无法访问它。

这是我尝试的请求,但它 returns 我全部 SpacesDisplayConfiguration:

$defaults read com.apple.spaces SpacesDisplayConfiguration Space\ Properties

我认为这只是一个语法错误,但我找不到问题所在。

不可能 read 比根级别更深级别的特定属性

如果你喜欢做丑陋的事情,你可以做一些非常丑陋的事情:

defaults read com.apple.spaces > /tmp/$$.plist
/usr/libexec/PlistBuddy -c 'print :SpacesDisplayConfiguration:Space\ Properties' /tmp/$$.plist

尽管这可能不那么难看:

/usr/libexec/PlistBuddy -c 'print SpacesDisplayConfiguration:Space\ Properties' $HOME/Library/Preferences/com.apple.spaces.plist

以下尝试无效,如果有人知道为什么他们可以 ping 我 - 我认为这与 bash 进程替换不可搜索有关。

defaults read com.apple.spaces | /usr/libexec/PlistBuddy -c 'print :SpacesDisplayConfiguration:Space\ Properties' /dev/stdin

defaults read com.apple.spaces | /usr/libexec/PlistBuddy -c 'print :SpacesDisplayConfiguration:Space\ Properties' -

/usr/libexec/PlistBuddy -c "print" <(defaults read com.apple.spaces)

我只是简单地使用了 catgrep。不太优雅,但简单且有效:

cat path/to/file.plist | grep -A 1 <key>

输出示例:

    <key>slideScanBlurThreshold</key>
    <real>0.0</real>

如果您可以下载工具,Scout 可以读取键中带有 space 的嵌套值。

scout read -i $HOME/Library/Preferences/com.apple.spaces.plist -f plist \
"SpacesDisplayConfiguration.Space Properties"

比 Amin 的答案短 4 个符号 ;-)

grep -A 1 <key> path/to/file.plist

所讨论的具体 属性 不是字符串,而是字典数组。

将在每个 space 中打印 space 名称和 window ID 的最小 python 代码(至少需要 v3.5):

#!/usr/bin/env python3

import plistlib
from pathlib import Path

with (Path.home() / "Library/Preferences/com.apple.spaces.plist").open('rb') as fi:
    plist = plistlib.load(fi)
    spaces = plist['SpacesDisplayConfiguration']['Space Properties']

    for space in spaces:
        print('name:', space['name'])
        print('windows:', space['windows'])

# SAMPLE OUTPUT:
# name: 
# windows: [7227, 7168, 5383, 6338, 6202, 5312, 6093, 6755, 6669, 6438, 6314, 4984, 4637, 3916, 6061, 5977, 5973, 80, 6452]
# name: F10F36F4-2698-4DC0-9D1E-769712C306CC
# windows: [5370, 3565, 213, 7190, 6142, 7105, 7146, 5948, 6138, 6141, 6140, 6139, 1353, 4673, 6021, 5925, 1585, 5892, 6453]

This approach will work with both binary and XML .plist files.