我們提過一個概念,就是任何裝置在Linux中都是檔案,不僅如此,連資料通訊的介面也由專屬檔案負責。所以,你會瞭解到,Linux的檔案種類很多。除了前面提到的 -, d即所謂的一般檔案與目錄檔案之外,還有哪些種類的檔案呢?
檔案種類
在介紹屬性時,提到了最前面的標誌(d或 -)可以表示目錄或檔案,那就是不同的檔案種類。Linux的檔案種類主要有下面這幾種:
• 普通檔案(regular file):就是一般我們存取的檔案,由ls -al顯示出來的屬性中,第一個屬性為 [-],例如 [-rwxrwxrwx]。另外,依照檔案的內容,又大致可以分為:
純文字檔案(ASCII):這是Unix系統中最多的一種檔案類型,之所以稱為純文字檔案,是因為內容為我們可以直接讀到的資料,例如數字、字母等等。設定檔案幾乎都屬於這種檔案類型。舉例來說,使用命令“cat ~/.bashrc”就可以看到該檔案的內容(cat是將檔案內容讀出來)。
二進位檔案(binary):我們在GNU發展史中提過,系統其實僅認識且可以執行二進位檔案(binary file)。Linux中的可執行檔(指令碼,文本方式的批次檔不算)就是這種格式的。舉例來說,命令cat就是一個二進位檔案。
資料格式的檔案(data):有些程式在運行過程中,會讀取某些特定格式的檔案,那些特定格式的檔案可以稱為資料檔案(data file)。舉例來說,Linux在使用者登入時,都會將登入資料記錄在 /var/log/wtmp檔案內,該檔案是一個資料檔案,它能通過last命令讀出來。但使用cat時,會讀出亂碼。因為它是屬於一種特殊格式的檔案。
• 目錄(directory):就是目錄,第一個屬性為 [d],例如 [drwxrwxrwx]。
• 串連檔案(link):類似Windows下面的捷徑。第一個屬性為 [l],例如 [lrwxrwxrwx]。
• 裝置與裝置檔案(device):與系統外設及儲存等相關的一些檔案,通常都集中在 /dev目錄。通常又分為兩種:
塊(block)裝置檔案:就是儲存資料以供系統存取的介面裝置,簡單而言就是硬碟。例如一號硬碟的代碼是 /dev/hda1等檔案。第一個屬性為 [b]。
字元(character)裝置檔案:即序列埠的介面裝置,例如鍵盤、滑鼠等等。第一個屬性為 [c]。
• 通訊端(sockets):這類檔案通常用在網路資料連線。我們可以啟動一個程式來監聽用戶端的要求,用戶端就可以通過通訊端來進行資料通訊。第一個屬性為 [s],最常在 /var/run目錄中看到這種檔案類型。
• 管道(FIFO, pipe):FIFO也是一種特殊的檔案類型,它主要的目的是,解決多個程式同時存取一個檔案所造成的錯誤。FIFO是first-in-first-out(先進先出)的縮寫。第一個屬性為 [p]。
那麼,使用“ls -al”命令,就可以簡單通過判斷每一個檔案的第一個屬性來瞭解這個檔案是何種類型。
除了裝置檔案是系統中很重要的檔案,最好不要隨意修改之外(通常它也不會讓你修改),另一個比較有趣的檔案就是串連檔案。如果常常將應用程式放到案頭,就應該知道在Windows下面有所謂的“捷徑”。同樣,可以將Linux 下的串連檔案簡單視為一個檔案或目錄的捷徑。通訊端與管道檔案比較難理解,因為它們與進程(process)密切相關,到將來瞭解進程(第17章)之後,再回來查看吧。此外,也可以通過man fifo及man socket來查看系統說明。
Linux副檔名
基本上,Linux檔案是沒有“副檔名”的,我們知道,Linux檔案能否執行,與它第一列的10個屬性有關,與檔案名稱一點關係也沒有。這與Windows不同。在Windows中,能執行的副檔名通常是 .com、.exe、.bat等等,而在Linux中,只要屬性中有x,例如 [-rwx-r-xr-x] 即表示這個檔案可以執行。
不過,可以執行與可執行成功是不一樣的。舉例來說,在root家目錄下的install.log是一個純文字檔案,如果修改許可權成為 -rwxrwxrwx後,這個檔案能執行嗎?當然不行。因為它的內容根本就沒有可執行檔資料。所以說,x表示這個檔案具有可執行檔能力,但能不能執行成功,當然就要看該檔案的內容。
雖然副檔名沒有什麼實際的協助,不過,由於我們仍然希望可以通過副檔名來瞭解該檔案是什麼,所以,通常還是會以適當的副檔名來表示該檔案是什麼類型。下面有數種常用的副檔名:
• *.sh:批次檔(scripts,指令碼),因為批次檔使用shell寫成,所以副檔名就編成 .sh。
• *Z, *.tar, *.tar.gz, *.zip, *.tgz:經過打包的壓縮檔。這是因為壓縮軟體分別為gunzip、tar等等的,根據不同的壓縮軟體而取其相關的副檔名。
• *.html, *.php:網頁相關檔案,分別表示HTML文法與PHP文法的網頁檔案。.html的檔案可使用網頁瀏覽器來直接開啟, .php的檔案則可以通過用戶端的瀏覽器來瀏覽伺服器端,以得到運算後的網頁結果。
另外,還有程式語言如Perl的檔案,其副檔名也可能取成 .pl。基本上,Linux上面的檔案名稱只是讓你瞭解該檔案可能的用途而已,真正的執行與否仍然需要屬性的規範。例如,雖然有一個檔案為可執行檔,如有名的Proxy 伺服器軟體squid,如果這個檔案的屬性被修改成無法執行,那麼它就不能執行。在檔案傳送的過程中常發生這種問題。例如,你在網路上下載一個可執行檔,但是,偏偏在你的Linux系統中就是無法執行。那就是可能檔案的屬性被改變了。從網路上傳送到你的Linux系統中,檔案的屬性確實是會被改變的。
另外,在Linux中,每一個檔案或目錄的檔案名稱最長可以到255個字元,加上完整路徑時,最長可達4096個字元,是相當長的檔案名稱。我們希望Linux的檔案名稱可以一看就知道該檔案的作用,所以檔案名稱通常是很長,這對於用慣Windows而導致打字速度不快的人來說,真的是很困擾。不過,只能加強打字訓練了。通過前一章的熱鍵你也會知道,其實可以通過 [tab] 按鍵來確認檔案名稱。這很好用。當然,如果已經讀完了本書第3篇關於BASH的用法,那麼你將會發現“變數真是相當好用”。看不懂,沒關係,到第3篇談到bash再說。
Linux檔案名稱的限制
一般來說,在設定Linux下的檔案名稱時,最好避免一些特殊字元。例如下面這些:
* ? > < ; & ! [ ] | / ' " ` ( ) { } |
因為這些符號在命令列介面下是有特殊意義的。另外,檔案名稱的開頭為小數點“.”時,表示這個檔案為“隱藏檔案”。同時,由於命令中常常會使用 -option之類的參數,所以最好也避免將檔案名稱的開頭以 - 或 來命名。