如何在终端中读取 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)
我只是简单地使用了 cat
和 grep
。不太优雅,但简单且有效:
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.
我正在尝试访问 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)
我只是简单地使用了 cat
和 grep
。不太优雅,但简单且有效:
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.