Linux命令--檔案和目錄管理
6.1 Linux檔案系統的組織方式稱作檔案系統分層標準(Filesystem Hierarchy Standard,簡稱FHS),即採用層次式的樹狀目錄結構,此結構的最上層是根目錄“/”。Linux檔名最長允許256個字元,檔名沒有副檔名的概念,對大小寫敏感。
6.2 系統的預設安裝目錄
/:Linux檔案系統的最上層目錄,其他所有目錄均是該目錄的子目錄;
/bin:Binary的縮寫,存放使用者的可執行程式,如cp和mv等,也存放Shell,如bash和csh。不應把該目錄放到一個單獨的分割槽中,否則Linux Rescue模式無法使用這些命令;
/boot:作業系統啟動時所需的檔案,包括vmlinuz和initrd.img,這些檔案若是損壞常會導致系統無法正常啟動,因此最好不要做任意改動;
/dev
/etc:有關係統設定與管理的檔案,包括密碼、守護程式以及X-Window相關的配置。可以通過編輯器(如vi、gedit等)開啟並編輯相關的配置檔案;
/etc/X11:X-Window System的配置目錄;
/home:普通使用者的主目錄或FTP站點目錄,一般存放在/home目錄下;
/lib:存放共享函式庫(library);
/mnt:檔案系統掛載點(Mount),例如光碟的掛載點可以是/mnt/cdrom,軟盤的掛載點可以是/mnt/floppy,Zip驅動器為/mnt/zip;
/opt:該目錄通常提供給第三方較大型的應用程式使用,如Sun Staroffice、Corel WordPerfect,這可避免將檔案分散至整個檔案系統;
/proc
/root:根使用者的主目錄;
/sbin:System Binary的縮寫。此目錄存放的是系統啟動時所需執行的系統程式;
/tmp:temporary的縮寫,用來存放臨時檔案的目錄;
/usr:存放使用者使用的系統命令和應用程式;
/usr/bin:存放使用者可執行的程式,例如OpenOffice的可執行程式;
/usr/doc:存放各種文件的目錄;
/usr/include:存放C語言用到的標頭檔案;
/usr/include/X11:存放X-Window程式使用的標頭檔案;
/usr/info
/usr/lib:函式庫;
/usr/lib/X11:存放X-Window的函式庫;
/usr/local:提供自動安裝的應用程式位置;
/usr/man:存放線上手冊的目錄;
/usr/sbin:存放使用者經常使用的程式;
/usr/src:儲存程式的原始檔的目錄,一般系統核心原始碼存放在/usr/src/linux目錄下;
/usr/X11R6/bin:存放X-Window的可執行程式;
/var:Variable的縮寫,存放包括日誌、郵件等經常變化的檔案。由於/var目錄的大小經常變動,為了防止失去控制而侵佔其他目錄所需要的空間,建議將/var安裝到一個獨立的分割槽上。
6.3 裝置檔案
Linux下使用的裝置如本地磁碟、網路檔案系統、CD-ROM、U盤等都被識別為裝置檔案。當對裝置檔案進行I/O操作時,該操作會轉給相應的裝置驅動程式。一個裝置檔案用主裝置號(指出裝置型別)和從裝置號(指出是該型別的第幾個裝置)來表示,可以通過mknod命令進行建立。典型裝置檔案有:
/dev/hda:第一個IDE介面的Master硬碟;
/dev/hdb:第一個IDE介面的Slave硬碟;
/dev/hdc:第二個IDE介面的Master硬碟;
/dev/hdd:第二個IDE介面的Slave硬碟;
/dev/sda:第一個SCSI介面的Master硬碟;
/dev/sdb:第一個SCSI介面的Slave硬碟;
/dev/sdc:第二個SCSI介面的Master硬碟;
/dev/sdd:第二個SCSI介面的Slave硬碟;
/dev/cdrom:光碟機;
/dev/fd0:第一個軟盤。
6.4 檔案系統的型別
Linux相容性很高,除了能夠掛載各種型別的裝置,還可以掛載其他各種檔案系統。檔案/proc/filesystem列出了系統當前可用的檔案系統型別,其中不僅包括Unix支援的各種檔案系統型別,也包括Windows檔案系統。Linux支援的檔案系統型別包括:
adfs:acron磁碟檔案系統,是在RiscOS作業系統中使用的標準檔案系統;
befs:BeOS作業系統使用的檔案系統;
cifs:通用Internet檔案系統(Common Internet File System,簡寫為CIFS),用於訪問符合SNIA CIFS標準的伺服器。CIFS對SMB協議進行改進和標準化(SMB協議可用於在Linux和Windows之間共享檔案),是一種虛擬檔案系統;
ext:ext檔案系統的第一個版本,現在已經很少使用;
ext2:專門為Linux系統設計的檔案系統,具有速度快和CPU佔用率低等選特點。既可以用於標準的塊裝置,也可以應用到移動儲存介質上。ext2不包括日誌功能;
ext3:與ext2相比包含了日誌功能,維護了最近更改的源資料(和檔案有關的資訊,包括許可權、所有者、建立時間、訪問時間等)的記錄,如果源資料由於非法關機等原因遭到破壞,檔案系統將不能正常工作。通過ext3的日誌系統,可以對源資料進行適當的恢復。此外,ext3的日誌功能可使硬碟讀寫頭的移動達到最佳化;
iso9660:從High Sierra(CD-ROM使用的最初標準)發展而來的檔案系統,是CD-ROM的標準檔案系統;
kafs:AFS客戶端檔案系統,用於分散式計算環境,可與Linux、Windows和Macintosh客戶端共享檔案;
minix:最初用於Unix的minix版本,只支援長度為30字元以下的檔名;
msdos:MS-DOS、Windows和OS/2使用該檔案系統,不支援長檔名,主要用於掛載Micorsoft作業系統生成的軟盤;
vfat:Microsoft擴充套件FAT(VFAT)檔案系統,支援長檔名,可被Windows9x/2000/xp使用;
umsdos:擴充套件的MS-DOS檔案系統,不僅支援長檔名,還保持了對UID/GID、POSIX許可權和特殊檔案(如管道、裝置)的相容;
proc:基於記憶體的偽檔案系統,不佔用外存空間,只是以檔案的方式為訪問Linux核心資料提供介面。由於proc檔案系統是虛擬的,所以無需掛載。使用者和應用程式可以通過/proc得到系統的執行資訊,並可以改變核心的某些引數;
reiser:reiserfs日誌檔案系統;
swap:用於交換分割槽,是系統虛擬記憶體的一部分;
nfs:網路檔案系統(Network FileSystem,簡寫為NFS)型別;
hpfs:用於只讀掛載OS/2 HPFS檔案系統;
ncpfs:Novell Netware檔案系統,可以通過網路掛載;
affs:Amiga計算機使用的檔案系統;
ufs:Sun Microsystems作業系統(即Solaris和SunOS);
xfs:一種在高效能環境中很有用的日誌檔案系統,支援完整的64位定址;
fs:JFS主要適合於企業系統,是為大檔案系統和高效能環境而設計的;
xiafs:與minux檔案系統相比,這種檔案系統支援長檔名和更大的i節點;
coherent:System V使用的檔案系統型別;
smb:支援SMB協議的網路檔案系統,可用於實現Linux與Windows系統的檔案共享。
6.5 檔案系統的組成
ext3檔案系統將磁碟分為4個塊:
塊0為引導塊,包含系統啟動程式的磁碟區塊;
塊1為超級塊,主要用來記錄檔案系統的配置方式,其中包括i節點數量、磁碟區塊數量、未使用的磁碟區塊以及i節點表、空閒塊表在磁碟中存放的位置。由於超級塊儲存了非常重要的檔案資訊,所以系統儲存了超級塊的冗餘。fsck等命令修復檔案系統時,實際上就是對超級塊進行恢復操作。
塊2存放i節點(i-node,index-node)表,記錄檔案大小、使用者UID、使用者組GID、檔案存取模式(包括讀、寫或執行)、連結數目、檔案最後修改時間、磁碟區塊地址、間接區塊等。
塊3為資料儲存塊,存放檔案內容。
檔案有兩種不同的組織方式:
邏輯結構:面向使用者的,使用者可以看到的表示檔案內容的字元流。
物理結構:檔案在磁碟上的儲存方式,涉及具體的存放磁碟區塊。使用者看到的檔案內容是連續的,但實際上檔案可能並不是連續的方式存放在磁碟上的。事實上,大於1塊(block)的檔案將被分散地存放在磁碟上。i節點表幫助實現這種物理結構到邏輯結構的轉換。
i結點是一個64位元組長的表,表中包含了檔案的相關資訊和磁碟地址表。磁碟地址表中有13個塊號。前10個塊號是檔案前10塊的存放地址,檔案根據塊號在磁碟地址表現中出現在的順序依次讀取相應的塊。當檔案長度大於10個塊,將會用到後面的3塊所給出的間接地址塊。磁碟地址表中的第11塊給出了擴充套件塊的位置,這個塊號指出的塊中含有256個塊號,加上前10塊檔案長度為266塊(272384位元組)。如果檔案大於266塊,再啟用磁碟地址表的第12塊所定義的擴充套件塊。當檔案大於266+256x256塊時,再啟用第13個擴充套件塊,這時檔案所佔的塊數為266+256x256+256x256x256。
檔案系統採用一對一對映的方法來實現檔名到i節點的轉換。目錄實際上是一個含有目錄表的檔案,對於目錄中的每個檔案,在目錄表中都會有一個入口項,入口項中含有檔名和與檔案相應的i節點號。df -i檢視系統中節點的大小與數量。ls -i可以檢視檔案的i-node編號。
6.6 檔案的型別
命令ls -l可以檢視檔案的詳細資訊,其中在行首的字串包含檔案的型別與許可權資訊,如:-rw-r--r--,首字母表示的就是檔案的型別。檔案可以分為:
普通檔案:檔案型別標識位為-,如-rw-r--r--。包括源程式檔案、指令碼檔案、可執行程式檔案以及各種資料檔案。
目錄檔案:檔案型別標識位為d,如drwxrwxrwt。目錄實際上是特殊的檔案,可以包含檔案和子目錄。
套接字檔案:檔案型別標識位為s,如srwx-------。Linux檔案系統可以通過套接字檔案實現網路通訊。
命名管道:檔案型別標識位為p,如prwx------。檔案系統通過命名管道檔案可以實現程序間的通訊。
裝置檔案:裝置檔案分兩類:字元裝置和塊裝置。字元裝置檔案型別標識位為c,包括印表機,鍵盤等。塊裝置檔案型別標識位為b,包括磁碟磁帶等。
連結檔案:檔案型別標識位為l,包括硬連結和軟連結。
6.7 檔案和目錄的許可權
檔案和目錄的許可權共分為5類:
符號表示 | 八進位制表示 | 含義 |
- | 0 | 沒有許可權 |
r | 4 | 讀許可權 |
w | 2 | 寫許可權 |
x | 1 | 執行許可權 |
s、S、t、T | 特殊許可權 |
命令ls -l可以檢視到許可權資訊,如-rwxrw-r--表示該檔案為普通檔案,檔案所有者的許可權為rwx,即可讀可寫可執行;同組使用者的許可權為rw-,即可讀可寫;其他使用者許可權為r--,即只讀。
檔案許可權可以用八進位制表示,如rwx許可權可以表示為4+2+1=7;rw-許可權可以表示為4+2+0=6;r--許可權為4+0+0=4。所以許可權rwxrw-r--也可以表示為764。
除讀、寫、執行許可權外,檔案系統還有類特殊許可權,包括set-UID、set-GID和粘滯位(sticky)。set-UID對應值為4,表示如果該檔案是可執行的,則執行該檔案的使用者將在程式執行期間擁有與該檔案的所有者相同的許可權;set-GID對應值為2,表示如果檔案是可執行的,則執行該檔案的使用者會在執行期間擁有與該檔案的使用者組相同的許可權;粘滯位(sticky-bit)對應值為1,表示該檔案如果是可執行的,一旦被裝載進記憶體就一直駐留在記憶體。
許可權相關的命令有:
chmod:許可權設定與修改。(可以用八進位制模式,如chmod 764 ABC.exe,或者以字元模式,如chmod u+x ABC.exe表示給檔案的檔案所有者增加執行許可權。其中u、g、o、a分別表示檔案所有者、組使用者、其他使用者和全部使用者。+、-、=分別表示增加、減少和指定許可權。設定特殊許可權只能用八進位制模式,利用4位八進位制數的第一位來設定,如chmod 4777表示特殊許可權為set-UID,即4,後三位表示所有者、組和其他使用者的許可權。-R以遞迴方式更改所有的檔案和子目錄。-c只在有更改時才顯示結果。-v顯示全部資訊。)
umask:設定檔案或目錄的預設許可權。(通常新建檔案的預設許可權為0666,新建目錄的預設許可權為0777。掩碼可以改變許可權,如umask 0022,則新建檔案的許可權為0666-0022=0644,而新建目錄的許可權為0777-0022=0755。)
setfacl:設定訪問控制列表ACL。基於使用者和使用者組的許可權機制有些不足,無法為使用者組中的個別使用者設定不同的許可權。為此,訪問控制列表ACL被引入到系統中,它支援ext3檔案系統、NTFS檔案系統以及SMB檔案系統。在使用acl前,需確保裝置以ACL方式掛載:mount -o acl /dev/sda1 /mnt/mydisk。此後便可以用setfacl -m u:myuser:rw myfile的方式為個別使用者指定許可權。setfacl -x u:myuser myfile可以刪除許可權。setfacl -d g:rw myfile設定預設的許可權。)
6.8 建立Linux檔案系統
mkfs:建立檔案系統。(為磁碟分割槽指定檔案系統,如mkfs -t ext3 /dev/hda4。)
mkbootdisk:建立目前系統的啟動盤。(如mkbootdisk --device /dev/fd0 2.4.2.20-8在軟盤/dev/fd0上建立核心版本號為2.4.20-8的啟動盤。)
6.9 修復受損的檔案系統
fsck:檢測檔案系統並嘗試修復錯誤。(在正被掛載的檔案系統上使用fsck可能會造成檔案系統的嚴重損壞。)
e2fsck:檢查ex2檔案系統。
6.10 mount與umount命令
mount:掛載。(mount顯示已掛載的檔案系統。mount /dev/fd0 /mnt/floppy掛載軟盤。mount -t iso9660 /dev/cdrom /mnt/cdrom掛載光碟。mount -t vfat /dev/sdb /mnt/flash掛載U盤。
umount:解除安裝。(不能解除安裝根分割槽。)
eject:解除安裝並彈出光碟。
6.11 其它檔案和目錄管理常用命令
常用的萬用字元有:
*:代表檔案中任意長度的任意字元。比如ls n*w可以匹配檔案new。
?:代表檔案中的任一個字元。比如ls n?w可以匹配new。
[…]:匹配任意一箇中括號中的字元,中括號裡可以是一個用破折號分割的字母或數字範圍。比如ls n[1-9]w可以匹配n3w。
{…}:逐一匹配括號裡的字串。比如ls n{ew,ow}2 可以匹配new2與now2。
attr:XFS檔案系統物件的擴充套件屬性。(XFS檔案系統是SGI開發的高階日誌檔案系統。)
basename:顯示檔案或目錄的基本名稱。如basename /home/tommy顯示tommy。該檔案或目錄未必存在。
cd:改變目錄。
cp:複製檔案。(例:cp srcfile destfile。-b如果目標檔案已存在,則以備份形式儲存,在檔名後加上“~”;-r複製所有子目錄與子檔案;-f強制執行;[email protected]指定目標檔名的字尾為@。)
chattr:改變檔案的屬性。(用法:chattr [-RVf] [-+=AacDdeijsSu] [-v version] files...。+新增屬性,-刪除屬性,=設定屬性。lsattr可以檢視檔案屬性。各屬性的意義:
A:不修改時間。
a:檔案只能以追加模式寫入,根使用者擁有設定或清除該屬性的許可權。
c:自動進行壓縮。
D:對目錄的修改會直接同步寫入磁碟,該屬性等同於dirsync命令。
d:使用dump命令時,不對具有該屬性的檔案進行備份。
E:表明壓縮存在錯誤。
I:目錄被Hash樹索引。
i:檔案不可被修改、刪除、重新命名、建立連結或寫操作。
j:在向檔案執行寫入操作時,先記錄日誌。
s:安全刪除檔案,檔案塊被清零並寫回磁碟。
S:當檔案被修改時,將修改寫入磁碟,等同於sync命令。
T:具有該屬性的目錄將被移到目錄樹的最頂層。
t:檔案在進行合併時,不會留有碎塊。
u:當檔案被意外刪除時,可以恢復。
X:壓縮檔案可以被直接訪問。
Z:壓縮檔案損壞。)
cksum:檔案的CRC校驗。
chown:改變所有者。(chown username file只改變檔案的所有者,如果chown groupname:username file的方式,可以同時改變組和使用者,冒號或點號都可以作為分隔符。如果是chown groupname: file的形式,則只改變使用者組。)
chgrp:更換使用者組。
dirname:顯示檔案的除名字外的路徑。
fold:自動換行以適應指定列寬。(fold -w 5 file以每行至多5列的方式列印檔案。)
find:查詢目錄或檔案。(-name string:找檔名包含字串的檔案;-user username:找屬於使用者的檔案;-group groupname:找屬於使用者組的檔案;-type x:找型別為x的檔案,其中b為塊裝置檔案、c為字元裝置檔案、d為目錄檔案、p為命名管道檔案、f為普通檔案、l為符號連結檔案、s為socket檔案;-follow跟蹤符號連結檔案到所指向的檔案。)
file:顯示檔案型別。(例:file *顯示當前目錄下所有檔案的型別。)
filterdiff:從diff檔案中提取或去除差異。
findfs:通過卷標或UUID查詢檔案系統。(例:findfs LABEL=/。)
locate:定位檔案或目錄。(從資料庫/var/lib/slocate中查詢檔案,該資料庫一般一天更新一次,所以最新新增或刪除的檔案可能會找不到。由於是從資料庫而非硬碟中查詢,所以比find快上許多。)
ls或dir:列目錄。(-a顯示以.開頭的隱藏檔案;-A顯示包括. 和..的所有檔案;-F顯示檔案型別的指示符號,.表示隱藏檔案、/表示一個目錄、*表示一個可執行檔案、@表示符號連結檔案、|表示管道檔案、=表示 socket檔案;-l使用長格式列出資訊;-R列出所有子目錄;-x逐行列出專案;-1每行只列一個檔案。ll為ls -asF的別名。)
ln:連結檔案或目錄。(-s符號連結。)
lndir:建立到目錄的符號連結。(例:lndir source dest把source資料夾下的所有檔案生成在dest資料夾下相應的符號連結。)
lsattr:顯示檔案屬性。(-a顯示所有目錄和檔案;-R顯示子目錄的內容。)
mkfontdir:建立x字型檔案目錄。(對指定的目錄搜尋所有的字型檔案,並生成檔案fonts.dir,供X伺服器和字型伺服器使用。)
msggen:建立英語訊息目錄。(輸入檔名是最近建立的英文PO檔案或PO模板檔案,通常由xgettext建立。未翻譯的記錄會被填上和msgid一樣的字串,並標記為模糊。)
msgcomm:匹配訊息。(在兩個或多個指定PO檔案中找出共同的資訊。)
msgcat:合併訊息。(連線和合並指定的PO檔案。)
mkdir:建立目錄。(-m設定許可權,類似於chmod;-p需要時建立上層目錄。)
mv:移動或更名現有的檔案和目錄。
mattrib:修改或顯示MS-DOS檔案的屬性。(模擬MS- DOS的attrib命令,+/-開啟或關閉屬性,屬性有a:歸檔位,被備份程式用來標識一個檔案是不是新檔案;r:只讀位,標識只讀檔案;s:系統位:標識作業系統檔案;h:隱藏位,使檔案在目錄中不可見。-/列出包含所有子目錄的檔案屬性;-X簡明方式,列出屬性,不含任何空格。
mc:視覺化檔案管理程式。(可以用滑鼠操作。)
mcopy:複製MS-DOS檔案到UNIX或從UNIX複製MS-DOS檔案。
md5sum:計算和檢測MD5資訊摘要。(MD5是一種雜湊值。例:md5sum file。)
mdel:MS-DOS檔案刪除。
mdir:顯示MS-DOS目錄。
mktemp:建立暫存檔案。(該檔案可供Shell指令碼安全地使用。)
mmove:移動MS-DOS檔案。
mren:更改MS-DOS檔名稱。
mshowfat:顯示分配給檔案的FAT簇資訊。
mtools:顯示mtools支援的命令。
mtoolstest:測試並顯示mtools的相關設定。
paste:對檔案進行縱向合併。(例:paste file1 file2分別把兩個檔案中的各行合併輸出到標準輸出上。-s以序列方式輸出兩個檔案。-d指定合併行的分隔符。)
rcp:遠端複製檔案或目錄。(例:rcp [email protected] /home/src/patch /home/src。)
rm:刪除檔案或目錄。(-r遞迴刪除;-f強制刪除;-i刪前確認;-d:刪除可能仍有資料的目錄。)
rmdir:刪除空目錄。(-p刪除路徑中所有的空目錄。)
slocate:安全查詢檔案或目錄。(從其自己建立的資料庫中查詢。與locate一樣。)
split:切割檔案。(cat合併檔案,split切割檔案。-l指定每個檔案包含的行數,預設為1000。-b指定每個檔案的位元組數;-C指定每個檔案的大小,可用b、k、m作為單位。)
stat:顯示inode內容。(-f顯示檔案系統狀態而不是檔案狀態。-L跟隨連結。-t以簡潔格式顯示資訊。)
scp:遠端複製檔案。(在網路中不同主機之間複製檔案。例:scp -v [email protected]:/root/test [email protected]:/home/my/。-4強制使用IPv4協議;-6強制使用IPv6協議。-P指定埠號。)
sum:計算檔案的校驗碼。
tmpwatch:刪除臨時檔案。(例:tmpwatch 100 /tmp/刪除/tmp目錄下100小時內沒有使用的檔案。-u基於檔案的訪問時間刪除檔案,預設值;-m基於檔案的修改時間刪除檔案;-c基於檔案i節點的修改時間刪除檔案,預設值;-a刪除所有檔案,不僅是常規檔案和目錄;-d不刪除目錄;-f強制刪除;-t不刪除檔案,僅測試;-s刪除檔案之前使用 fuser命令檢測檔案是否正在被使用。-v冗餘模式,具有2能冗餘,即連續兩個-v選項。)
touch:更新檔案或目錄時間。(如果檔案不存在,則建立。-a更改存取時間;-c不建立任何檔案;-d使用指定時間而非當前時間;-F sec時間提前sec秒;-m只更新變動的時間;-r使用指定檔案的時間屬性而非目前的時間;-t stamp使用[[CC]YY]MMDDhhmm[.ss]格式的時間而非目前的時間。)
tree:以樹狀圖顯示目錄內容。
which:查詢檔案。(查詢範圍由環境變數$PATH設定,如which ls。)
lsof:檢視正在被程式使用的檔案。(lsof | grep 檔案系統的掛載點可以找出某裝置正在被哪個程式使用。)
blkid:查詢裝置上採用的檔案系統型別。(可以找出UUID和type,如blkid /dev/sda2。)
debugfs:恢復已刪除的檔案。(首先需解除安裝要恢復檔案的分割槽,再用命令debugfs /dev/sda1進入互動模式,互動模式中ls可檢視檔案,可以看到“<檔案資訊節點編號>”的檔案,使用dump <編號> file把刪除的檔案恢復到file裡。)