這個問題看來容易。因為我們可以用
* | 表示所有不是以 "." 為開端的檔案 |
.* |
表示所有以 "." 為開端的檔案,但是這樣會把 "." 和 ".." 也包 含進來,但是通常你並不會想把這兩個也含進來。 |
.[!.]* |
這只有比較新的 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 字元,或是萬用字 元仍然是沒輒。