以 git + awk 實現批量化操作爲例,探討命令行的處理過程
使用 git 操作項目文件時,常常需要對多個文件進行相同的操作。一些圖形化程序中提供了多文件操作的支持,不過功能相對簡單。也許大部分人並不需要太複雜的功能,但如果有這種功能,許多重複的工作便可以消除,效率也能得到提高。
在這裏我們把 git 作爲一個簡單的命令,此命令有許多選項,每一個選項可能需要一些參數。
我們可以想象,在大多數時間內,參數主要由文件名組成,這些文件名參數中可能存在着不同的模型,或者說能夠通過某一正則表達式或其它表達式——如萬用字符來描述。
這些模型能夠表示出一個文件名的集合,有了這個集合,我們的操作單位便不再侷限於單個文件名,而是文件名集合,這樣就能夠實現批量化操作。
不過,必須注意的是,有時候我們很難或者說根本就找不到一個模型來容納需要的文件名,這可能受限於所使用的描述對象以及自己所掌握的描述能力。這時可以不必苦苦糾結,採用最原始最簡單的方法來完成任務即可。
這裏我以完成任務爲第一要務,這並不是說我們不應該繼續嘗試尋找一個模型,只是如果一定要先找到一個模型,那樣可能需要花費大量的時間,不僅不必要而且會讓這個簡單的步驟變得複雜。這也說明了並不是所有情況都要先去尋找一個模型。當文件名很少而且你幾秒之內想不到一個模型時,直接操作單個文件名可能更好!
一些具體的實例如下:
# 批量刪除後綴爲 .c 的文件
git status | awk '/deleted.*\.c$/ {print $2}' | xargs -i git rm -rf {}
# 批量添加後綴爲 .xml 的文件
git status | awk '/modified.*\.xml$/ { print $2 }' | xargs -i git add {}
#批量從倉庫中檢出後綴名爲 .h 的文件名
git status | awk '/modified.*\.h$/ {print $2}' | xargs -i git checkout {}
上述示例十分簡單,卻能夠很好的說明問題。在上面的不同操作中,其步驟可以統一敘述如下:
- 製作輸入參數表
- 編寫篩選規則
- 篩選需要的參數
- 傳遞參數並執行需要的命令
上面的步驟不禁讓我想起了 lisp 中序列處理的抽象過程。這個抽象過程從枚舉序列開始到對每一個序列元素執行映射,然後篩選需要的結構,構造出新的序列。有了這樣的過程,便能夠在更高的抽象層次描述問題,序列操作得到了推廣。
雖然上述示例使用命令的形式,但其中的過程與 lisp 中的表操作有着共通之處。
如果要總結一下的話,那麼這樣的形式可以稱爲對命令行處理過程的抽象吧!這只是其中的一個實例而已。