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:
Post a Comment