1. 程式人生 > >linux下普通檔案和目錄檔案區別

linux下普通檔案和目錄檔案區別

http://my.oschina.net/michaelyuanyuan/blog/109147

檔案許可權一般可認為是0 123 456 789,一共十位: 
0:表示該檔案的檔案型別。Windows裡面是使用了一種檔案關聯的技術,通過副檔名來關聯相應的應用程式,使得雙擊某個檔案,就能達到呼叫相應的應用程式來開啟它的目的,這樣簡單快捷。然而對於使用者來說,好處是方便,壞處是隱藏了一個實質性的東西:檔案的真正的型別,與其副檔名實際上是毫無關聯的。 
舉例來說:一個純粹的文字檔案,我可以給它命名“我的歌聲裡.mp3”,然後在win下雙擊,會呼叫相應的音樂播放器來開啟,結果顯而易見,肯定是錯誤的。那反過來,一個真正的MP3檔案我也可以給它命名“花名冊.txt”,在win下雙擊,一般會呼叫相應的文字編輯器來開啟,不過我說你也知道,顯示的一定是亂碼。 


上面兩個例子是為了說明一個觀點,某個檔案真正的型別與其副檔名沒一毛錢關係。 
那麼在不知道副檔名的情況下,如何知道檔案的型別呢?在Linux是這樣的。 
Linux中檔案型別只有以下這幾種:
1.-,普通檔案。 
2.d,目錄檔案,d是directory的簡寫。 
3.l,軟連線檔案,亦稱符號連結檔案,s是soft或者symbolic的簡寫。 
4.b,塊檔案,是裝置檔案的一種(還有另一種),b是block的簡寫。 
5.c,字元檔案,也是裝置檔案的一種(這就是第二種),c是character的檔案。 
Linux系統最原始的也只有這五種,所以第0位,只能是以上五者之一。 
那麼你會有疑問, 
1.MP3檔案是是哪種?答案:普通檔案。 

2.二進位制檔案是哪種?答案:普通檔案。 
3.文字檔案是哪種?答案:普通檔案。 
4.為什麼硬連線沒有型別表示?答案:硬連線和軟連線,名字上雖然只差一個字,本質完全不同,硬連線也是檔案。其型別是普通檔案。 


為什麼上面要說這麼多呢?目的是為下文做知識鋪墊。 


那麼 123-456-789 都好說,瞭解這塊兒的人都知道,他們只是 使用者-屬組-其他 這三組之間的區別,我們拿其中任意一組作為例子來講解rwx皆可。 
r:read,w:write,x:execute。 




我們應該如何去記憶這兩者之間的區別呢??難道死記硬背?NO。 
我們應該知其然還得知其所以然,下面我試圖從這查詢檔案以及內容的本質出發,來闡述rwx許可權在這兩者身上為何有不同的意義! 



理解下面的所說的,需要關於Linux的檔案系統的知識做鋪墊。如果不知道inode這個概念,基本上就會很吃虧了。 


再次強調,檔案的內容和該檔案當時所用的檔名毫無關聯;該檔案的型別,也與該檔案當時的檔名,毫無關係。 


檢視一個檔案的內容,實際上是這樣的一個過程: 


舉例來說,你用了這個命令:cat /tmp/abc.txt 


1.你只傳遞了一個絕對路徑,/tmp/abc.txt,系統首先要知道/tmp/abc.txt檔案的inode是多少才行,如何得知呢? 
2.記住一個規律,某檔案的父目錄會(記錄)知道該檔案的inode號!(此刻我想你是不是悟出一點什麼了,不用急,接著往下看) 
3.那麼我得到“/tmp/abc.txt”這個檔名,我得先知道/tmp目錄的情況,要知道/tmp目錄的情況,我得先知道/目錄的情況,所以我就可以從/目錄開始(假設/目錄的inode號是0,並且這是寫死的),然後再去一張叫做inode-table的表中查詢inode號0所指向的資料域,然後從資料域裡面可以找到一些類似於下面的內容:(看起來像一張表,不是麼?其實可以想象到,目錄檔案就是一張表,儲存了它內部有哪些檔名,以及該檔名對應的inode號) 
檔名 inode號 
bin    18 
var    19 
tmp    20 
...    ... 
好了,我們從“/”,這個目錄檔案中找到了“/tmp”檔名對應的inode號,就是20。(假設啊) 
4.然後我們通過inode號20,去inode-table裡面找尋20對應的資料域,然後從資料域中,我們又會找到一張表:(為什麼又是表呢?因為“/”是一個目錄,“/tmp”也是一個目錄,那當然資料域裡面存的還是表啦) 
檔名  inode號 
abc.txt 8899 
bbb.mp3 10088 
kkk.jpg 20000 
... ... 
好了,我們找到了/tmp/abc.txt的inode號了,就是8899。根據上面的規律,我們是不是又得去inode-table裡面找8899號對應的資料域了?對,就是這樣。 
5.我們找到inode號8899對應的資料域,於是我們會發現如下一些內容: 
“abcdefg”(假設檔案內容就是這樣) 
... 


又有疑問了,為毛這次不是表了? 
答案:/tmp/abc.txt檔案不是目錄檔案了,它是一個普通檔案,他儲存的一般都是一些字串。 




體現在本質上: 
普通檔案:儲存普通資料,一般就是字串。 
目錄檔案:儲存了一張表,該表就是該目錄檔案下,所有檔名和inode的對映關係。 
從父目錄中獲得本檔案的inode號---->找到inode-table表中找到這個inode號對應的資料域中的起點以及其他資訊---->去這個資料域中讀取該檔案的內容(普通檔案的內容一般是字串,目錄檔案的內容是一張表) 
如果你真心看懂上面我說的了,那麼接下來就變得簡單多了。 


關鍵就是訪問任何一個檔案,要看是否能搞到inode號,搞不到就沒轍了。搞到inode就好說了,拿著inode號去inode表中查詢即可,最後找到資料域,那麼就可以找到檔案的內容了 
然後整個過程這不僅僅跟本檔案許可權有關,還跟它的父目錄(還有父目錄的父目錄...)許可權有關(是否能搞到本檔案的inode) 


體現在命令上:(話說這才是最實際的表象) 
====== 
對於普通檔案來說,rwx的意義是: 
r:可以獲得這個普通檔案的名字和內容。 
w:可以修改這個檔案的內容和檔名。可以刪除該檔案,但是使用者會得到是否刪除防寫檔案的prompt。 
x:該檔案是否具有被執行的許可權。 
====== 
於目錄檔案來說,rwx的意義是: 
r-x:可以進入cd該目錄,可以獲得該目錄下儲存情況,但是不能修改這個目錄內部儲存的檔案(目錄)的名字,也不能在該目錄下新建檔案和目錄 
-wx:可以進入cd該目錄,但是看不到該目錄下的儲存情況(ls不可用),可以往該目錄下新增、修改、刪除檔案。可以通過cat來讀取該目錄下的檔案or目錄的內容,由於得不到該目錄下儲存了那些檔案,在不知情的情況下只能通過猜,cat + 檔名獲得檔案內容,所以這樣依然不保密。 
--x:可以進入cd該目錄,看不到儲存情況,也不能往該目錄下新增、修改、刪除檔案。但是依然可以通過cat + xx(猜)來獲得該目錄下的檔案的內容。 
rw-:不能進入cd該目錄,用ls僅僅可以獲得檔名和目錄名,因為獲取不到這些檔案的inode號,當然也不能獲得該目錄下的檔案的內容。不能往該目錄下新增、修改、刪除檔案。 
====== 



最後總結一下吧: 
1.目錄檔案雖然是檔案(唉,誰叫Linux的核心理念就是Everything is file),但是儲存內容的只是一張表而已,關於檔名和inode號的對映關係。 
2.檔案的副檔名和檔案型別之間,沒一毛錢關係。 
3.檔案的檔名和檔案實際儲存內容之間,沒一毛錢關係。 
4.要知道如何查詢到一個檔案內容的過程。 
5.為什麼同一個檔案系統移動檔案要比跨檔案系統快? 
答:因為只需要修改某個目錄中路徑和inode對應關係即可,不需要重新寫一遍資料域。 
6.什麼是買來的500G的硬碟,格式化完後總是少了達不到500G? 

答:從本文可知,inode-table也是需要佔用儲存空間的,所以缺少的一部分中inode-table佔用了不少。
7.我不想吃虧,那麼我要如何瞭解Linux檔案系統和inode的相關知識,能否推薦個文章?
答:http://www.cyberciti.biz/tips/understanding-unixlinux-filesystem-inodes.html