1. 程式人生 > 實用技巧 >第三章 Linux檔案和目錄管理

第三章 Linux檔案和目錄管理

一、Linux檔案系統的層次結構

在 Linux 作業系統中,所有的檔案和目錄都被組織成以一個根節點“/”開始的倒置的樹狀結構,如圖所示。





其中,目錄就相當於 Windows 中的資料夾,目錄中存放的既可以是檔案,也可以是其他的子目錄,而檔案中儲存的是真正的資訊。

檔案系統的最頂層是由根目錄開始的,系統使用“/”來表示根目錄,在根目錄之下的既可以是目錄,也可以是檔案,而每一個目錄中又可以包含(子)目錄或檔案。如此反覆就可以構成一個龐大的檔案系統。

其實,使用這種樹狀、具有層次的檔案結構主要目的是方便檔案系統的管理和維護,想象一下,如果所有的檔案都放在一個目錄下,其檔案系統的管理和維護將變成一場噩夢。

現實中也有許多類似的例子,例如在整個行政管理體制中,村民就相當於檔案,他們住在一個村莊中,村莊就是儲存村民的目錄。許多村又組成了個鄉,這個鄉就相當於儲存村的目錄,依此類推,最終就構建出了一個龐大的行政區域管理結構圖。

注意,目錄名或檔名都是區分大小寫的,如 dog、DOG 和 Dog 為 3 個不同的目錄或檔案。完整的目錄或檔案路徑是由一連串的目錄名所組成的,其中每一個目錄由“/”來分隔。如 cat 的完整路徑是 /home/cat。

在檔案系統中,有兩個特殊的目錄,一個是使用者所在的工作目錄,即當前目錄,可用一個點“.”表示;另一個是當前目錄的上一層目錄,也叫父目錄,用兩個點“..”表示。

如果一個目錄或檔名是以一個點開始,就表示這個目錄或檔案是一個隱藏目錄或檔案。即以預設方式査找(後續會講查詢命令)時,不顯示該目錄或檔案。

為了方便管理和維護,Linux 系統採用了檔案系統層次標準,也稱為FHS 標準,它規定了根目錄下各個目錄應該存在哪些型別的檔案(或子目錄),比如說,在 /bin 和 /sbin 目錄中存放的應該是可執行檔案。

二、Linux絕對路徑和相對路徑詳解

在 Linux 中,簡單的理解一個檔案的路徑,指的就是該檔案存放的位置,例如,在《Linux檔案系統的層次結構》中提到的 /home/cat 就表示的是 cat 檔案所存放的位置。只要我們告訴 Linux 系統某個檔案存放的準確位置,那麼它就可以找到這個檔案。


指明一個檔案存放的位置,有 2 種方法,分別是使用絕對路徑和相對路徑。

我們知道,Linux 系統中所有的檔案(目錄)都被組織成以根目錄“/”開始的倒置的樹狀結構,如圖 1 所示。



絕對路徑一定是由根目錄 / 開始寫起。例如,使用絕對路徑的表示方式指明 bin 檔案所在的位置,該路徑應寫為 /usr/bin,測試程式碼如下:

[root@localhost ~]# bin
bash: bin: command not found   <-- 沒有找到
[root@localhost ~]# /usr/bin
bash: /usr/bin: is a directory   <-- 是一個檔案

可以看到,如果僅傳遞給 Linux 系統一個檔名,它無法找到指定檔案;而當將 bin 檔案的絕對路徑傳遞 Linux 系統時,它就可以成功找到。

和絕對路徑不同,相對路徑不是從根目錄 / 開始寫起,而是從當前所在的工作目錄開始寫起。使用相對路徑表明某檔案的儲存位置時,經常會用到前面講到的 2 個特殊目錄,即當前目錄(用 . 表示)和父目錄(用 .. 表示)。

舉個例子,當我們使用 root 身份登入 Linux 系統時,當前工作目錄預設為 /root,如果此時需要將當前工作目錄調整到 root 的子目錄 Desktop 中,當然可以使用絕對路徑,示例程式碼如下:

[root@localhost ~]# pwd     <-- 顯示當前所在的工作路徑
/root
[root@localhost ~]# cd /root/Desktop
[root@localhost Desktop]# pwd
/root/Desktop

注意,這裡所使用的 pwd 和 cd 命令,目前只需知道它們的功能即可,具體用法會在後續文章中作詳細講解。

可以看到,通過使用絕對路徑,我們成功地改變了當前工作路徑。但除此之外,使用相對路徑的方式會更簡單。因為目前處於 /root 的位置,而 Desktop 就位於當前目錄下,所以:

[root@localhost ~]# pwd    <-- 顯示當前所在的工作路徑
/root
[root@localhost ~]# cd ./Desktop
[root@localhost Desktop]# pwd
/root/Desktop

此程式碼中,./Desktop 表示的就是 Destop 檔案相對於 /root 所在的路徑。

再舉一個例子,如果以 root 身份登入 Linux 系統,並實現將當前工作目錄由 /root 轉換為 /usr 目錄,有以下 2 種方式:

#使用絕對路徑
[root@localhost ~]# pwd <-- 顯示當前所在的工作路徑
/root
[root@localhost ~]# cd /usr
[root@localhost ~]# pwd
/usr
#使用相對路徑
[root@localhost ~]# pwd <-- 顯示當前所在的工作路徑
/root
[root@localhost ~]# cd ../usr <-- 相對 root,usr 位於其父目錄 /,因此這裡要用到 ..
[root@localhost ~]# pwd
/usr

總之,絕對路徑是相對於根路徑 / 的,只要檔案不移動位置,那麼它的絕對路徑是恆定不變的;而相對路徑是相對於當前所在目錄而言的,隨著程式的執行,當前所在目錄可能會改變,因此檔案的相對路徑不是固定不變的。

三、Linux檔案(目錄)命名規則

我們知道,在 Linux 系統中,一切都是檔案,既然是檔案,就必須要有檔名。同其他系統相比,Linux 作業系統對檔案或目錄命名的要求相對比較寬鬆。

Linux 系統中,檔案和目錄的命名規則如下:

  1. 除了字元“/”之外,所有的字元都可以使用,但是要注意,在目錄名或檔名中,使用某些特殊字元並不是明智之舉。例如,在命名時應避免使用 <、>、?、* 和非列印字元等。如果一個檔名中包含了特殊字元,例如空格,那麼在訪問這個檔案時就需要使用引號將檔名括起來。
  2. 目錄名或檔名的長度不能超過 255 個字元。
  3. 目錄名或檔名是區分大小寫的。如 DOG、dog、Dog 和 DOg ,是互不相同的目錄名或檔名,但使用字元大小寫來區分不同的檔案或目錄,也是不明智的。
  4. 與 Windows 作業系統不同,檔案的副檔名對 Linux 作業系統沒有特殊的含義,換句話說,Linux 系統並不以檔案的副檔名開分割槽檔案型別。例如,dog.exe 只是一個檔案,其副檔名 .exe 並不代表此檔案就一定是可執行檔案。


需要注意的是,在 Linux 系統中,硬體裝置也是檔案,也有各自的檔名稱。Linux 系統核心中的 udev 裝置管理器會自動對硬體裝置的名稱進行規範,目的是讓使用者通過裝置檔案的名稱,就可以大致猜測處裝置的屬性以及相關資訊。

udev 裝置管理器會一直以程序的形式執行,並偵聽系統核心發出的訊號來管理位於 /dev 目錄下的裝置檔案。

表 1 羅列出了Linux 系統中常見硬體裝置的檔名。

表 1 Linux硬體裝置檔名稱
硬體裝置 檔名稱
IDE裝置 /dev/hd[a-d],現在的 IDE裝置已經很少見了,因此一般的硬碟裝置會以 /dev/sd 開頭。
SCSI/SATA/U盤 /dev/sd[a-p],一臺主機可以有多塊硬碟,因此係統採用 a~p 代表 16 塊不同的硬碟。
軟碟機 /dev/fd[0-1]
印表機 /dev/lp[0-15]
光碟機 /dev/cdrom
滑鼠 /dev/mouse
磁帶機 /dev/st0 或 /dev/ht0

四、Linux命令基本格式

命令提示符

登入系統後,第一眼看到的內容是:

[root@localhost ~]#

這就是 Linux 系統的命令提示符。那麼,這個提示符的含義是什麼呢?

  • []:這是提示符的分隔符號,沒有特殊含義。
  • root:顯示的是當前的登入使用者,筆者現在使用的是 root 使用者登入。
  • @:分隔符號,沒有特殊含義。
  • localhost:當前系統的簡寫主機名(完整主機名是 localhost.localdomain)。
  • ~:代表使用者當前所在的目錄,此例中使用者當前所在的目錄是家目錄。
  • #:命令提示符,Linux 用這個符號標識登入的使用者許可權等級。如果是超級使用者,提示符就是 #;如果是普通使用者,提示符就是 $。


家目錄(又稱主目錄)是什麼? Linux 系統是純字元介面,使用者登入後,要有一個初始登入的位置,這個初始登入位置就稱為使用者的家:

  • 超級使用者的家目錄:/root。
  • 普通使用者的家目錄:/home/使用者名稱。


使用者在自己的家目錄中擁有完整許可權,所以我們也建議操作實驗可以放在家目錄中進行。我們切換一下使用者所在目錄,看看有什麼效果。

[root@localhost ~]# cd /usr/local
[root@localhost local]#

仔細看,如果切換使用者所在目錄,那麼命令提示符中的會變成使用者當前所在目錄的最後一個目錄(不顯示完整的所在目錄 /usr/ local,只顯示最後一個目錄 local)。

命令的基本格式

接下來看看 Linux 命令的基本格式:

[root@localhost ~]# 命令[選項][引數]

命令格式中的 [] 代表可選項,也就是有些命令可以不寫選項或引數,也能執行。那麼,我們就用 Linux 中最常見的 ls 命令來解釋一下命令的格式(有關 ls 命令的具體用法,後續章節會詳細介紹)。如果按照命令的分類,那麼 ls 命令應該屬於目錄操作命令。

[root@localhost ~]# ls
anaconda-ks.cfg install.log install.log.syslog

1) 選項的作用

ls 命令之後不加選項和引數也能執行,不過只能執行最基本的功能,即顯示當前目錄下的檔名。那麼加入一個選項,會出現什麼結果?

[root@localhost ~]# Is -l
總用量44
-rw-------.1 root root 1207 1 月 14 18:18 anaconda-ks.cfg
-rw-r--r--.1 root root 24772 1 月 14 18:17 install.log
-rw-r--r--.1 root root 7690 1 月 14 18:17 install.log.syslog

如果加一個"-l"選項,則可以看到顯示的內容明顯增多了。"-l"是長格式(long list)的意思,也就是顯示檔案的詳細資訊。至於 "-l" 選項的具體含義,我們稍後再詳細講解。可以看到選項的作用是調整命令功能。如果沒有選項,那麼命令只能執行最基本的功能;而一旦有選項,則可以顯示更加豐富的資料。

Linux 的選項又分為短格式選項(-l)和長格式選項(--all)。短格式選項是英文的簡寫,用一個減號呼叫,例如:

[root@localhost ~]# ls -l

而長格式選項是英文完整單詞,一般用兩個減號呼叫,例如:

[root@localhost ~]# ls --all

一般情況下,短格式選項是長格式選項的縮寫,也就是一個短格式選項會有對應的長格式選項。當然也有例外,比如 ls 命令的短格式選項 -l 就沒有對應的長格式選項。所以具體的命令選項可以通過後面我們要學習的幫助命令來進行査詢。

2) 引數的作用

引數是命令的操作物件,一般檔案、目錄、使用者和程序等可以作為引數被命令操作。例如:

[root@localhost ~]# ls -l anaconda-ks.cfg
-rw-------.1 root root 1207 1 月 14 18:18 anaconda-ks.cfg

但是為什麼一開始 ls 命令可以省略引數?那是因為有預設引數。命令一般都需要加入引數,用於指定命令操作的物件是誰。如果可以省略引數,則一般都有預設引數。例如:

[root@localhost ~]# ls
anaconda-ks.cfg install.log install.log.syslog

這個 ls 命令後面沒有指定引數,預設引數是當前所在位置,所以會顯示當前目錄下的檔名。

總結一下:命令的選項用於調整命令功能,而命令的引數是這個命令的操作物件。