1. 程式人生 > >macOS: 使用新版plutil命令操作Plist檔案更方便

macOS: 使用新版plutil命令操作Plist檔案更方便

前言

自從OS X 10.11和更新版macOS 10.12作業系統釋出以來,plutil命令的功能也隨之有了增強,使我們可以除了使用defaults和PlistBuddy命令之外,又多了一個有力的操作工具。

最早plutil命令單單用來對Plist檔案進行語法驗證和格式轉換,沒有太多的用途。現在它除了部分功能,如顯示部分不如defaults和PlistBuddy靈活外,對於Plist的寫操作有了突出的改進,比defaults要簡單,與PlistBuddy不相上下。

下面就介紹下它的具體功能。

介紹

Plist檔案是由一對一對的“鍵”和“值”組成的,鍵(Key)是後面值(Value)的名稱,值可能是簡單的數值或字串,也可能是複雜的資料,這在後面具體說。

測試環境

首先,為了方便,我們現在當前使用者目錄下面建立一個空目錄:~/plutil_temp,然後在Termianl中轉到該目錄為當前目錄,後面的測試我們都在該目錄下進行。

mkdir -p ~/plutil_temp
cd ~/plutil_temp

建立空Plist檔案

由於plutil命令還不支援建立一個空的Plist檔案,我們可以用下面命令建立一個空的檔案:

echo '<?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"><dict/></plist>' > example.plist

注意上面的命令是一行命令,不分行。

或者使用其他命令建立帶有初始值的Plist檔案,比如:

/usr/libexec/plistbuddy -c Set: example1.plist

雖然它會顯示錯誤資訊,但是依然可以成功建立一個空的原始Plist檔案。
也可以嘗試使用defaults命令建立一個,這裡不再贅述。

線上幫助

先來顯示一下它的線上幫助:

plutil -h

先仔細看一下它的線上幫助

驗證Plist檔案格式

現在讓我們來驗證一下我們前面建立的空Plist檔案格式是否正確:

plutil -lint example.plist

如果檔案格式沒問題,會在stdout中顯示OK,同時返回值為0

顯示檔案內容

這個也很簡單,使用-p命令:

plutil -p example.plist

顯示結果:

{
}

請記住它的輸出格式,這種格式叫做json,其實plutil只支援json格式輸出的。
不妨試試,用諸如cat命令來顯示我們的示例檔案,它應該是XML格式的文字檔案:

cat example1.plist

上面的命令顯示的就是標準的XML文字格式的Plist檔案。
請記住兩個輸出的不同,最好再看一下檔案的大小。
下面我們詳細說plist檔案格式

轉換格式

Plist支援三種格式: xml1, json和binary,前兩者都是純文字格式,後一種是二進位制格式。也就是說前兩種使用文字編輯器方便地編輯,二進位制格式就不好手動編輯了。如果需要手動編輯,還是先轉化為文字格式,完成後再轉化回二進位制格式。

一般來說,對於使用作業系統提供的標準Plist檔案操作API,無論是哪種格式都正常可以操作,沒有任何差別。

轉換格式使用-convertml命令:

plutil -convert json example.plist

轉換之後,我們再來看看檔案的大小。是不是變化了?!

一個小啟發,能不能用另外一種更簡單的方式建立一個新的Plist檔案呢?

建立簡單鍵值

Plist檔案支援下面的簡單型別:

型別 說明
-bool 布林型
-integer 64位整數
-float 64位浮點數
-string 字串
-date 時間
-data 資料(是base-64轉碼字串)

建立使用-insert(插入)命令。我們一一舉例說明

plutil -insert Agree -bool "Yes" example.plist
plutil -insert Passed -bool "True" example.plist
plutil -insert Count -integer 10 example.plist
plutil -insert Total -float 9876.54321 example.plist
plutil -insert LastName -string "Liu" example.plist
plutil -insert FirstName -string "Tony" example.plist
plutil -insert Content -data "cGx1dGls5ZG95Luk5omp5bGV5LuL57uNCg==" example.plist

這些都很簡單,但是-date型別有點麻煩,至今為止已知的時間型別它都不支援,根據plutil的線上說明
“-date: a date in XML property list format,”
我們只好使用後面才提到的XML格式,這在後面一節統一介紹。至於為什麼只能這樣,還不知道。

刪除一個鍵

刪除使用-remove命令,舉例說

plutil -remove Passed example.plist

替換一個鍵值

替換使用-replace命令,舉例說

plutil -replace Total -float 9876.54321 example.plist

提取一個鍵值

plutil沒有一個內建命令用於顯示某一項的值。其中一種方法,雖然有點笨重,我們可以利用-extract命令來實現。
比如我們要顯示LastName的內容:

plutil -extract LastName xml1 example.plist -o LastName.plist; plutil -p LastName.plist

它的過程是,使用-extract來講需要的項提取到一個新的plist檔案中(LastName.plist),然後在顯示它的內容。
其實還可以有很多其他方法,留給讀者自己考慮

複雜鍵值操作

好了這是它的精華之處了。
話說一個Plist檔案,之所以可以包含多種的鍵和值,關鍵一點就是它的根一定是一個字典型別,在XML中以表示。下面我們說說他的複雜型別。
複雜鍵值包括數列和字典。

陣列

什麼是陣列?陣列是同質資料的集合,可以使用整數作為索引訪問每個資料物件。什麼是”同質資料“呢,就是說,一個數組中如果任何一個數據是浮點數型別,那麼所有的都是浮點數型別。
陣列的資料也可以是後面說的”字典“型別,至於陣列中每個字典是否機構相同,Plist中沒有強制要求,所以可以不同。

字典

什麼是字典型別呢?它是一種可以包含子鍵值對的物件資料。子鍵值對可以是前面說的任意的簡單和複雜型別。

複雜型別的標識

在plutil命令中,可以使用下面兩種方式表示

型別 說明
-xml XML格式
-json JSON格式

舉例

記得前面提到的無法使用-date輸入一個時間型別的值把,我們這裡就使用-xml來實現

plutil -insert CreateTime -xml "<date>2017-01-26T04:59:49Z</date>" example.plist

看見了,和之間的就是ISO8601的UTC日期與時刻表示法的字串格式

陣列

我們下面通過具體操作來介紹如何使用plutil來運算元組。建議每次操作完成之後,使用-p命令來檢視檔案的變化,這樣可以直觀地看見他的前後變化,利於理解。

建立陣列

怎麼建立一個數組呢?我們可以上面提到的兩種標識來做,比如:

plutil -insert listStyle -xml "<array/>" example.plist
plutil -insert listColor -json "[]" example.plist

第一句建立一個叫做listStyle的陣列,第二個建立一個叫做listColor的陣列

插入陣列項

plutil -insert listStyle.0 -string "Suite" example.plist
plutil -insert listStyle.1 -string "Casual" example.plist
plutil -insert listStyle.2 -string "Casual" example.plist
plutil -insert listStyle.3 -string "Vibrant" example.plist

上面我們依照順序在listStyle陣列中插入了四個字串型別的陣列項。從中可以看出,訪問每個陣列項的索引表達方式。

plutil -insert listColor.0 -string "Red" example.plist
plutil -insert listColor.1 -string "Green" example.plist
plutil -insert listColor.0 -string "Orange" example.plist
plutil -insert listColor.3 -string "Purple" example.plist

上面的例子中,第一句在位置.0處插入了”Red”,.1出插入“Green”,而第三句又在.0處插入了”Orange”,那麼結果是:

listColor.0 = Orange
listColor.1 = Red
listColor.2 = Green

也就是說插入點的資料順序向後移動。

刪除陣列項

在刪除前先看看example.plist檔案中的資料。
這個不難想象,根據前面的知識應該可猜到。比如我們刪除listColor的”Green”一項,還記得它的位置吧,是.2,所以:

plutil -remove listColor.2 example.plist

刪除後,在看看結果。

替換陣列項

與前面的刪除方法是類似的,比如我們上面的listStyle中有兩個都是Casual,我們把.2的換成Elegant:

plutil -replace listStyle.2 -string "Elegant" example.plist

字典

同上面介紹陣列時的建議一樣,還是掏多觀察操作前後的變化

建立字典

怎麼建立一個字典呢?我們可以上面提到的兩種標識來做,比如:

plutil -insert Employee -xml "<dict/>" example.plist

第一句建立一個叫做Employee的字典物件,第二個建立一個叫做Education的字典物件

插入字典專案

plutil -insert Employee.LastName -string "Liu" example.plist
plutil -insert Employee.FirstName -string "Tony" example.plist
plutil -insert Employee.UserName -string "TonyLiu" example.plist
plutil -insert Employee.Phone -string "1-222-890-1234" example.plist
plutil -insert Employee.Password -data "5oiR5LiN5ZGK6K+J5L2gCg==" example.plist

上面我們依照順序在Employee字典中插入了五個各種型別的專案。從中可以看出,訪問每個字典內各個專案的表達方式。

刪除陣列項

有了陣列的經驗,相信這裡不會難倒讀者了:

plutil -remove Employee.Password example.plist

替換陣列項

替換根式清澈熟路了:

plutil -replace Employee.Phone -string "13911399999" example.plist

後序

命令比較

簡單說來:
. defaults命令使用domain的概念訪問plist檔案,而且對命令的檔案書寫方式要求嚴格(比如不能帶.plist),有的時候還找不到或無法訪問非標準目錄的,而且對複雜格式資料的鞋操作比較麻煩。但是它的讀取操作確比plutil簡單多了。
. plutil對於複雜格式的寫操作很直觀,很類似於對類的操作,而且檔名也是直截了當,就是讀資料功能太弱。
. PlistBuddy可以說具有前面兩者的有點,避免了它們各自的缺點,書寫也方便。但是對於系統引數的plist檔案操作,還是使用Defaults命令號,因為它會通知系統服務該引數檔案已經修改,而PlistBuddy則不會。

參考

相關推薦

macOS: 使用新版plutil命令操作Plist檔案方便

前言 自從OS X 10.11和更新版macOS 10.12作業系統釋出以來,plutil命令的功能也隨之有了增強,使我們可以除了使用defaults和PlistBuddy命令之外,又多了一個有力的操作工具。 最早plutil命令單單用來對Plis

Linux命令操作HDFS檔案系統

HDFS命令操作 # 格式化操作 $ bin/hdfs namenode -format # 展示檔案和資料夾列表 $ bin/hdfs dfs -ls / # 建立資料夾 # 在使用者目錄下建立 $ bin/hdfs dfs -mkdir AAA/ # 在根目錄下建立 $ bi

Linux基礎命令一:檔案及目錄的基本操作

1. ls 檢視 列出,檢視指定目錄下的檔案資訊 [[email protected] ~]# ls -l 長格式顯示詳細資訊,可簡寫為ll [[email protected] ~]# ls -l 或 [[email protected] ~

[Xcode10 實際操作]七、檔案與資料-(8 )讀取和解析Plist檔案(屬性列表檔案)

本文將演示如何讀取和解析Plist檔案,即屬性列表檔案。 它是用來儲存,序列化後的物件的檔案。 在專案名稱上點選滑鼠右鍵,彈出右鍵選單, 選擇【New File】新建檔案命令,建立一份屬性列表檔案。 在彈出的模板選項視窗中,點選右側的垂直滾動條,跳轉到【Resource】資原始檔的模板列表。 然後選

[Xcode10 實際操作]七、檔案與資料-(9)編碼建立Plist檔案(屬性列表檔案)

本文將演示如何通過編碼的方式,建立屬性列表檔案。 在專案導航區,開啟檢視控制器的程式碼檔案【ViewController.swift】 1 import UIKit 2 3 class ViewController: UIViewController { 4 5 ove

Linux基礎命令,目錄檔案操作,vi編輯器詳解

一、linux基礎命令 linux命令的執行必須依賴於shell命令直譯器。shell實際上是在linux系統中執行的一種特殊程式,它位於作業系統核心與使用者之間,負責接收使用者輸入的命令並進行解釋,將需要執行的操作傳遞給系統核心執行,shell在使用者和核心之間充當了一個“翻譯官”的角色。當用戶登入到li

mysql 命令列對檔案進行讀寫操作

首先在mysql中,使用如下指令: secure_file_priv後面跟著的路徑就是我們進行檔案操作的路徑: 檔案讀入: 將要讀的檔案放在上述路徑中, 使用如下指令: mysql> load data infile'c:/ProgramData/MySQL/My

ios 簡單的plist檔案讀寫操作(Document和NSUserDefaults)

//    [self getDocoumentsPath];//蘋果建議將程式建立產生的檔案以及應用瀏覽產生的檔案資料儲存在該目錄下,iTunes備份和恢復的時候會包括此目錄 //    [self getLibraryPath];//儲存程式的系統預設狀態設定 //

【Unix/Linux】【命令】【檔案,目錄操作工具】列出所有子目錄與檔案——ls (ll)命令

ls命令是Linux下最常用的命令。ls命令就是list的縮寫。預設下ls用來列印當前目錄的清單。如果ls指定其他目錄,那麼就會顯式指定目錄裡的檔案及資料夾清單。通過ls命令不僅可以檢視linux資料夾包含的檔案,而且可以檢視檔案許可權等等。 命令格式: ls [選項]

【Unix/Linux】【命令】【檔案,目錄操作工具】複製檔案或目錄——cp命令

cp命令用來複制檔案或者目錄,是Linux系統中最常用的命令之一。 一般情況下,shell會設定一個別名,在命令列下複製檔案時,如果目標檔案已經存在,就會詢問是否覆蓋,不管你是否使用-i引數。但是如果是在shell指令碼中執行cp時,沒有-i引數時不會詢問是否覆蓋。這說明命

shell命令列之檔案操作

【檔案操作】 1、反選刪除檔案 先執行:shopt -s extglob 再執行:rm -rf !(file1) rm -rf !(file1|file2) 2、清空檔案內容 :> file 【磁碟管理】 1、檢視當前目錄下個檔

Linux作業系統基礎操作總結 Linux作業系統基礎操作之基礎知識 Linux作業系統之基礎命令介紹 Linux作業系統基礎操作之目錄操作 linux作業系統基礎操作檔案操作 Linux作業系統之許可權管理

Linux作業系統基礎操作之基礎知識 Linux的組成 Linux核心:系統心臟,是作業系統的核心,實現作業系統的基本功能。 Linux shell:系統的使用者介面,提供使用者與核心互動的一種介面,解釋使用者輸入的命令並將其送入核心執行。 Linux應用程式:Linux作業系統中應用程式集合,包括:

Linux 命令操作匯入匯出SQL檔案

匯入資料庫 一、首先建空資料庫 格式: mysql>create database 資料庫名;舉例: mysql>create database abc; 二、匯

Linux中操作日誌檔案命令

昨天總結了日誌的一些用法和在程式中打日誌的重要性,今天來說說如何看日誌,linux系統下如何檢視日誌。 最常用的命令: tail -f + 日誌檔名 這種方式可以檢視正在改變的日誌檔案,它會把日誌裡最尾部的內容顯示在螢幕上,並且不斷重新整理,使你看到最新的檔案內容。 ta

.plist檔案的讀寫操作

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);  NSString *documentsDirectory = [paths objectAtIndex:0]

iOS plist 檔案讀寫操作

1丶 讀 //建立檔案管理器 NSFileManager *fileManager = [NSFileManagerdefaultManager]; NSArray *pathA = NSS

cocos lua 對plist檔案操作

cc.SpriteFrameCache:getInstance():addSpriteFrames(path)--載入.plist檔案 local sprite = cc.Sprite:createWithSpriteFrame(cc.SpriteFrameCache:ge

linux sed命令 + 高階SED 操作配置檔案

http://www.360doc.com/content/12/0209/14/8739082_185278180.shtml 上面的網址也有SED的 例子用法,更全 http://wenku.baidu.com/link?url=Ci_Bdi8nI4NbuEUP

陣列和字典的writeToFile方法——在專案開發中處理網路資料的時候,可以把請求獲得的網路資料儲存為plist檔案,這樣方便開發

在專案開發中處理網路資料的時候,可以把請求獲得的網路資料儲存為plist檔案,這樣更方便開發,下面是程式碼                                //路徑(可以隨便找個資料夾

【IOS沉思錄】IOS的資料持久化(plist檔案讀寫操作

人生苦短,道阻且艱;修行不易,且行且努力。 【專業擅長領域】:iOS開發,遊戲開發,圖形學 【擅長平臺】:iOS平臺,Unity --------------------------------------------------------- 【個人主頁】:信厚