檔案與目錄管理


一、介紹

在 Unix 系統裡面,最重要的兩個要素就是檔案 (file) 以及程序 (process) 了。 在這份文件裡面,我們要談的是關於檔案的部分。在 Unix 系統裡的檔案可以分為四種, 分別是:

  1. 一般檔案 (file)
  2. 目錄檔案 (directory)
  3. 裝置檔案 (device file)
  4. 符號連結檔 (symbolic link)

其中「一般檔案」和「目錄檔案」就如同大家已往接觸 DOS、Win95/NT 所擁有的觀念。 可以將其比喻為一棵樹,一般檔案就好比是樹葉,而目錄檔案則好比是樹枝。這就是檔案 系統的樹狀結構。

裝置檔案則是與已往對檔案的觀念稍有不同。在 UNIX 作業系統裡,每個周邊 設備都用 /dev 目錄下面的一個檔案來代表。不管是滑鼠、硬碟、音效卡以及虛擬終端機 等等都有相對應的裝置檔案。所以裝置檔案只會出現在 /dev 目錄下。

符號連結檔就像是一個一般檔案的「分身」,一個檔案和他的符號連結檔是具有相同 內容,但是會在不同目錄或是具有不同的名稱。前述的三種檔案形式都可以有符號連結 檔。

其他資料請參考書中第七章或其他 Unix 相關書籍裡與檔案系統相關的資料。


二、管理方法說明

(一) 檔案系統的管理
一個檔案系統 (file system),通常是被掛(mount)在一個目錄下。一個檔案系統 裡面可以包含上述四種形態的檔案。接下來就概述相關的檔案與管理的指令。
  1. /etc/fstab

    這個檔案的內容是描述本機器所掛上的每個檔案系統的資料。例如:

    # Device	Mountpoint	FStype	Options	Dump	Pass#
    # 裝置名稱    	使用目錄        形態    選項    
    /dev/sd0s1b	none		swap	sw	0	0
    /dev/sd0a	/		ufs	rw	1	1
    /dev/sd0s1e	/var		ufs	rw	1	1
    /dev/sd0s1f	/usr		ufs	rw	1	1
    /dev/sd0s1g	/mnt		ufs	rw	1	1
    #/dev/sd1s1e	/opt		ufs	rw	1	1
    /dev/sd1s1f	/opt		ufs	rw	1	1
    /dev/ccd0c	/common		ufs	rw	1	1
    /dev/cd0a	/cdrom		cd9660	ro,auto	0	0
    proc		/proc		procfs	rw	0	0
    

    每一行開始若為 "#" ,則表示此行為注解。每一行描述一個檔案系統。分別是 裝置名稱、使用的目錄、檔案系統形態,以及一些特別的選項。


  2. mount

    此指令用來將檔案系統掛到一個目錄上。如果你已在/etc/fstab 檔案裡定義過了,那就只要以目錄名稱做參數即可。例如 mount /mnt


  3. umount

    此指令將卸下掛在某個目錄的檔案系統。用法是umount /mnt。後述 的一些指令都要先把使用中的檔案系統卸下來才能繼續進行。


  4. df

    這個指令的目地在於查看整台機器目前所掛上的檔案系統與其狀態。直接使用 df 就會產生如下結果:

    Filesystem  1K-blocks     Used    Avail Capacity  Mounted on
    ^^^^^^^^^^  ^^^^^^^^^     ^^^^    ^^^^^ ^^^^^^^^  ^^^^^^^^^^
    檔案系統      總容量      使用    剩餘   使用率    所用目錄
    /dev/sd0a       49231    18991    26302    42%    /
    /dev/sd0s1e     49231     1710    43583     4%    /var
    /dev/sd0s1f    847103   499486   279849    64%    /usr
    /dev/sd0s1g    992755    54058   859277     6%    /mnt
    /dev/ccd0c    2017711   821718  1135462    42%    /common
    procfs              4        4        0   100%    /proc
    /dev/cd0a      664134   664134        0   100%    /cdrom
    /dev/sd1s1f    996943   135937   781251    15%    /opt      
    

    其中容量所用的單位是 1KB。如果你的系統是以 512 Bytes 為一個最小單位的話,可以 加上 -k 參數。

    在 Unix 中,每一個檔案都會佔用一個 inode。所以每個檔案系統都有一個 inode 列表 ,以構成 Unix 系統的樹狀檔案結構。df -i可以查詢每個檔案系統的 inode 使用量。例如:

    Filesystem  1K-blocks     Used    Avail Capacity iused   ifree  %iused  Mounted on
    /dev/sd0a       49231    18991    26302    42%    1157   14201     8%   /
    /dev/sd0s1e     49231     1722    43571     4%     215   15143     1%   /var
    /dev/sd0s1f    847103   499487   279848    64%   32102  175256    15%   /usr
    /dev/sd0s1g    992755    54058   859277     6%      11  245747     0%   /mnt
    /dev/ccd0c    2017711   821718  1135462    42%    8118  483400     2%   /common
    procfs              4        4        0   100%      58    4058     1%   /proc
    /dev/cd0a      664134   664134        0   100%       0       0   100%   /cdrom
    /dev/sd1s1f    996943   135937   781251    15%       3  245755     0%   /opt   
    

    其中iused、ifree、%iused就是與 inode 相關的資料。


  5. dumpfs

    這個指令是把一個檔案系統的詳細資料列印出來,須注意的是目標檔案系統必須是 目前沒有被掛在任何目錄下使用的才行。


  6. fsck

    這個指令的用途在於檢查你的檔案系統。通常是在你的檔案系統有問題時才會用到 。與上一個指令相同處在於,它只能檢查未掛上的檔案系統。fsck -y會對 fsck 所問的每個問題都回答 "Yes",才不會因為等待使用者輸入答案而浪費時間。


(二)各種檔案的管理
以下介紹各種檔案管理用的指令。
  1. cd

    此指令的意思即為更改目前路徑(change directory)。與 dos 下的用法一樣,只是 路徑是以 "/" 分隔。例如: cd /usr/local/bin


  2. ls

    列出某目錄下的所有檔案(內定是目前所在的目錄)。 ls -l 會列出檔案的詳細狀態(相當於 dos 下的 dir 指令) 。ls -a 則會連隱藏檔 (檔名為 "." 開頭的檔案) 也列出來。


  3. more、cat

    把檔案的內容顯示出來。more會在每顯示一頁時就暫停等候使用者的 命令 (例如:空白鍵就繼續顯示下一頁。),而cat則不會停下來。


  4. mkdir

    創造目錄。例如:mkdir /foo/bar


  5. rmdir

    刪除目錄,必須為空目錄才可用此指令,例如:rmdir /foobar


  6. mv

    搬移檔案或目錄,例如:mv foo bar


  7. cp

    複製檔案或目錄。例如:

    • cp foo bar (複製檔案)
    • cp -RL /foo /bar (複製整個目錄)

  8. rm

    刪除檔案或目錄。例如:

    • rm foobar (刪除檔案)
    • rm -fr /foo/bar (刪除整個目錄)

  9. file

    此指令可以判斷檔案的格式為何。例如:

    file foobar.gif
    foobar.gif: GIF image data, version 89a, 800 x 600, 256 colors
    

    他所依賴的資料為 /etc/magic ,詳情請參看 magic(5) 的說明文件。


  10. ln

    此指令為製作符號連結用的,例如:ln -s foo bar


  11. chown

    此指令用來更改檔案的擁有者。例如:chown root.wheel foobar 可以把檔案的擁有者更改成 root (同時是 wheel 群組)。


  12. chmod

    每一個檔案都可以設定權限,chmod 即為此用途的指令。首先看看什麼是檔案權限:
    ls -l

    drwxr-xr-x  95 root  wheel     1536 Nov 17 16:05 home/
    -r-xr-xr-x   1 root  wheel  1203402 Aug 14 14:11 kernel*
    -rw-------   1 root  wheel    14912 Aug  8 08:30 ktrace.out 
    lrwxrwxrwx   1 root  wheel       11 Jul 30 22:57 sys@ -> usr/src/sys
    drwxrwxrwt   2 root  wheel     1024 Aug 14 21:41 lost+found/   
    ^^^^^^^^^^     ^^^^  ^^^^^^^^ ^^^^^ ^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^^      
     檔案權限      擁有者 (群組)   大小    時  間        檔案名稱
    
    brw-r-----   1 root  operator    6,   2 Jul 30 23:14 cd0c   
    crw-rw-rw-   1 root  wheel       6,   0 Nov 19 08:11 ptyp0  
    

    所以一開頭的十個英文字母就分別代表檔案形態以及權限。第一個英文字母為檔案 形態,後面九個為檔案權限。例如:

    -rwxr-xr-x
    ^^^^^^^^^^
    | |  |  |
    | |  |  ---> Others , 除擁有者及其群組外的其他使用者。
    | |  ------> Group , 與擁有者同群組的使用者。
    | ---------> User , 檔案擁有者。
    -----------> 檔案形態。
    

    首先說明檔案形態:

    • b : block device ,就是可隨機讀取的裝置,例如硬碟、光碟。
    • c : character device , 只能循序讀取的裝置,例如終端機。
    • d : directory , 一個目錄。
    • l : link , 一個符號連結。
    • - : file , 一個普通檔案。

    對於每個檔案,不論其形態為何,都要針對不同對象設定其檔案權限。

    再來說明檔案權限種類:

    • r : Read , 讀取檔案內容的權限。
    • w : Write , 寫入檔案的權限。
    • x : Execute , 執行檔案的權限。
    • s : Set-id , 摹擬成其他身份的權限。
    • t : Sticky , 黏著位元的設定。

    檔案權限的對象分別為:

    • a : All 所有對象,包括下列的三種。
    • u : User,此檔案的擁有者。
    • g : Group,與檔案擁有者同群組的其他使用者。
    • o : Others,非上述兩種情況的其他人。

    設定的範例:

    1. chmod go-w foobar : 取消擁有者之外其他人對 foobar 檔案寫入的權限。
    2. chmod 644 foobar : 讓 foobar 檔案成為擁有者可讀寫,其他人只能 讀的狀態。
    3. chmod 755 foobar : 讓 foobar 檔案成為擁有者可讀寫及執行,其他 人只能讀與執行。

  13. find

    根據使用者的需求列出符合條件的檔案。舉例如下:

    • find / -name "*foo*" -ls
      尋找所有名稱內含 "foo" 的檔案,並且將其詳細資料印出。
    • find / -mtime +7 -delete
      尋找所有一星期(或更早)前更動過的檔案,並且將他刪除。
    • find / -user foo -group bar -ls
      尋找 foo 使用者 (bar 群組) 所擁有的檔案,並列出詳細資料。
    • find / -size +2048 -ls
      尋找所有大小超過 1 MB 的檔案,並將他列出。

最後更動時間: