next up previous
Next: 在 Bourne shell script 裡要怎麼找出最後一個參數? Up: 初學者可能會問的基本問題 Previous: 我如何在 .cshrc 中判斷是否在 login shell 中?

在 shell 中要用怎樣的 pattern 來表示除了 "." 與 ".." 外的所有檔案?

這個問題看來容易。因為我們可以用

* 表示所有不是以 "." 為開端的檔案

.*

表示所有以 "." 為開端的檔案,但是這樣會把 "." 和 ".." 也包 含進來,但是通常你並不會想把這兩個也含進來。

.[!.]*

這只有比較新的 shells 才能用;某些 shells 用 "" 代替 "!"; 而符合 POSIX 標準的 shells 一定能用 "!",但是大部份也都能接 受 "";所有具可移植性的應用程式都不應該在 "[" 之後緊接著沒 被 quota 起來的 "")表示所有以 "." 為開頭並且第二個字元不是  "." 的檔案;但是這樣卻會漏掉 "..foo" 這類的檔案。

.??*

表示所有以 "." 為開頭且檔名長度至少為 3 的檔案,這樣大概 就能避開 "." 和 ".." 了,但是卻還是會漏掉 ".a" 這類的檔。

所以想要正確地表示除了 "." 與 ".." 之外所有的檔案,你必須要用到 3 個 patterns(如果你沒有像 ".a" 這樣的檔案,那你可以去掉第一個  pattern):

        .[!.]* .??* *
或者我們也可以用一兩個外部程式和 backquote substitution。這樣就很完 美了:
      `ls -a | sed -e '/^\.$/d' -e '/^\.\.$/d'`
        (or `ls -A` in some Unix versions)
不過即使是這樣做,碰上檔名裡面含有換行字元, IFS 字元,或是萬用字 元仍然是沒輒。



Tan Koan-Sin
1999-03-02