09 April, 2009

命令列使用:ls、cmd 及 start

平常我都是用 MinGW 所提供的 MSYS 套件當作命令列系統, 可是遇到一個問題,每當我打 ls -t 總是要等好幾秒才會看到結果, 由於這個指令太常用了, 必須想一個替代方案才行, 我的解法是利用 windows 內建的 shell, ls -t 對應的指令如下
cmd //c dir //b //O-d

cmd 就是 windows 內建的 shell, 選項 //c 表示執行完後面的指令就結束, 而 dir //b //O-d 就是我們想要 cmd 執行的指令, dir 會列出目錄中的檔案及子目錄, 選項 //b 表示去掉標頭資訊, //O-d 表示依最新日期排序, 如果不清楚 dir 的使用方法, 可以試試選項 //?。 下面是兩者的所需的時間:

ls -t 2.812 secs
cmd //c 0.157 secs

差了 10 倍以上,ls -t 實在太慢了。 接下來介紹一個我自創的指令, 假設想要執行目前目錄下的最新檔案, 比方剛剛下載了一個 pdf 文件或是一個 jpg 檔, 那這一個檔案就是目前目錄的最新檔案, 利用前面介紹的指令再加上 start 就可完成這個動作:

     start `cmd //c dir //b //O-d | sed -n 1p`

start 1.jpg 會以預設開啟副檔名為 jpg 的程式來開啟 1.jpg, 而 start 1.pdf 會以預設開啟副檔名為 pdf 的程式來開啟 1.pdf。 問題來了,要怎麼產生目錄下最新檔案的名稱呢? 前面介紹的指令會將目錄下所有檔案由新到舊排列, 但我們只想要第一個,怎麼做呢? 簡單,利用 sed -n 1p 即可。 眼尖的人還會發現 start 後面的字串被反引號 ` 括起來, 這麼做的目的是先執行反引號中的指令以取得我們想要的檔名。 出個練習題,寫一個 bash function 假設名稱是 t, 使得 t i 會執行目前目錄下第 i 新的檔案。 答案如下:

function t()
{   arg=${1:-"1"}
    start "`cmd //c dir //b //O-d | sed -n \"${arg}p\"`"
}

上面用到 ${1:-"1"}$ 是 bash 特有的 Shell Parameter Expansion, 非常好用,之前我有舉過一個 例子

No comments: