再探 wcfind -- 用 find2perl 實作
由於 CVS、Subversion 這類的 version control systems,通常會在 working copy 目錄下,建立如 CVS/、.svn/ 的 meta directories,使得一些 command-line 工具會水土不服。例如,grep 會連 .svn/ 目錄下的檔案都去尋找,不僅拖慢速度,更讓結果雜亂,難以使用。因此,很久以前,我參照了 Ben Reser 的作法,弄了一個 wcfind 給自己用。
可是,之前的 wcfind 是使用 Bourne Shell 實作,並依賴於 FreeBSD 下的 find 版本。除了在 command prompt 裡呼叫 sh 會使原來的視窗「變一個樣子」的問題之外,在 Windows 下 GnuWin32 的 find,或 Linux 下的 find,因為參數格式不甚相同,故也無法通用。所以,我在 Windows 下一直沒有 wcfind/wcgrep 可用[1]。
今天本來想要土法煉鋼,用 perl 弄一個 wcfind,以便在 Windows 下用,結果發現了 find2perl 這個隨著 perl 散佈的工具程式,拿來實作 wcfind 剛好。因為是 perl,所以在不同平台下,參數的格式都一樣,因此更迴避了 GnuWin32 的 find 參數格式不同的問題。
假設我們的 find 指令這麼下:
SHELL> find <start-point> <expression> ...
那對應到 find2perl,指令就這麼下:
SHELL> find2perl <start-point> <expression> ... | perl
因為代換十分地簡單明瞭,故我們可以利用 find2perl 重新實作出 wcfind.sh 與 wcfind.bat,如下:
wcfind.sh:
#!/bin/sh find_path="$1"; shift; find2perl "$find_path" -name .svn -prune -o $@ | perl;
wcfind.bat:
@ECHO OFF SET find_path="%1" find2perl %find_path% -name .svn -prune -o %2 %3 %4 %5 %6 %7 %8 %9 | perl
其中,BATCH 版本的 wcfind.bat 裡面那串 %2 %3 %4 %5 %6 %7 %8 %9 實在很醜,也限制了參數的個數。如果我們有啟用 BATCH 的「命令擴充」功能,就可以使用 SHIFT 指令,然後用 %* 代替那一大串參數:
@ECHO OFF SET find_path="%1" SHIFT find2perl %find_path% -name .svn -prune -o %* | perl
整個程式邏輯,就跟 Bourne Shell 版本一模一樣。可惜的是,BATCH 的「命令擴充」功能,預設並不會開啟,Windows 也沒有像 UNIX 一樣,可以在第一行指定給 sh 的參數,因為實在找不到方法,在 BATCH 程式裡面,將自己的「擴充命令」功能打開,故我們只好用上一個土一點的版本。
- 我幾乎不在 Linux 上寫程式,除非必須要 porting 的時候。 ↩



Post a Comment