plutil -extractは、plist(property list)ファイルの指定したキーパスの値だけを、新しいplistとして抽出する。

値を抽出する

-extract <keypath> <fmt> -o <path>の形式で指定する。-o -を指定すると標準出力へ書き出す。

$ plutil -extract Tags json -o - sample.plist
["a","b"]

Tags配列だけがJSON形式で抽出される。xml1を指定すると、抽出した値をXML形式のplistとして出力する。xml1については【plutil】plistのxml1形式とbinary1形式の違い を参照。

$ plutil -extract Name xml1 -o - sample.plist
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<string>Sample</string>
</plist>

-expectで期待する型をチェックする

-expect <expect_type>を指定すると、抽出対象の値の型が期待通りかを検証する。-expectはキーパスとfmt引数の直後、-oより前に置く必要がある。

$ plutil -extract Count xml1 -expect integer -o - sample.plist
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<integer>3</integer>
</plist>

型が一致しない場合はエラーになり、終了コード1で終了する。

$ plutil -extract Count json -expect string -o - sample.plist
sample.plist: Value at [Count] expected to be string but is integer
$ echo $?
1

CIやスクリプトの中で、plistの特定のキーが期待した型であることを事前に検証してから後続処理へ渡したい場合に使える。

JSON形式ではスカラー値を単独で抽出できない場合がある

数値や真偽値のような単体のスカラー値をjsonフォーマットで抽出しようとすると、エラーになることを実機で確認した。

$ plutil -extract Count json -o - sample.plist
sample.plist: Invalid object in plist for JSON format

JSON全体としてはトップレベルに数値を置くこと自体は仕様上可能だが、plutilの実装ではこの形を受け付けない。数値や真偽値などのスカラー値を単独で取り出したい場合は、次の記事で扱うrawフォーマットを使う。

参考

【plutil】plistファイルの中身を人間可読な形式で表示する