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, 非常好用,之前我有舉過一個 例子

04 April, 2009

托福考試用書

Ptt 托福考試板 調查了一些評價不錯的托福考試用書:

書的價格如下:

繁體 簡體
閱讀 702 230
聽力 702 230
口說 432 190
寫作 540 240
OG 1223 390
字彙 432

繁體價錢是以博客來為準,知英跟字彙都打 9 折(之前有打 8 折), OG 沒打折,簡體價錢是以奇摩拍賣 留學家族 為準。 繁體書的價格我覺得太貴,後來發現有簡體書可以買,內容好像一樣, 字彙不算在內,繁體與簡體的價差是 3599 - 1280 = 2319 元, 差距有點大,所以除了字彙我打算買簡體的,雖然簡體書的質感會比較差。

此外,我想提一下這一本書「 旋元佑文法 」, 在舊托福時代,文法是考試的其中一科, 所以那時文法書應該很暢銷,我妹剛好有買這一本。 我在念博班,常常需要寫文章,英文文法當然是要強化的一環, 網路上對這本書的評價很高,於是就拿來 K 了。 這本書實在令人驚豔,它改變了我對英文文法的認識, 一直以來,我認為文法都是靠死背或是死記, 可是這本書卻是教人以邏輯判斷來理解文法, 實在是了不起的想法。 不過,這本書已經絕版了,奇摩拍賣上還有得買, 只是 價錢 是出人意外的高,至少是原價 360 元的兩倍以上, 如果真的對這本書有興趣,又找不到人借,可以試試搜尋引擎,會有相當多的相關結果。