以 git + awk 實現批量化操作爲例,探討命令行的處理過程

以 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 {}

上述示例十分簡單,卻能夠很好的說明問題。在上面的不同操作中,其步驟可以統一敘述如下:

  1. 製作輸入參數表
  2. 編寫篩選規則
  3. 篩選需要的參數
  4. 傳遞參數並執行需要的命令

上面的步驟不禁讓我想起了 lisp 中序列處理的抽象過程。這個抽象過程從枚舉序列開始到對每一個序列元素執行映射,然後篩選需要的結構,構造出新的序列。有了這樣的過程,便能夠在更高的抽象層次描述問題,序列操作得到了推廣。

雖然上述示例使用命令的形式,但其中的過程與 lisp 中的表操作有着共通之處。

如果要總結一下的話,那麼這樣的形式可以稱爲對命令行處理過程的抽象吧!這只是其中的一個實例而已。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章