
命令的輸出ls -l
產生以下結果:
文件權限和所有者之間的數字欄位是什麼?即那些是什麼1、1、1 和 2?我檢查了--help
但這並不能解釋它。
[編輯] 我認為這是目錄中文件的數量,但事實並非如此。參見圖片。 “tempFolder”有 3 個文件,但仍顯示“2”
答案1
註:@StephaneChazelas 評論後編輯
ls -l
權限區塊後輸出的第一個數字是硬連結的數量。
stat
它與“Links”中命令返回的值相同。
當引用檔案時,該數字是檔案的硬連結計數;當引用目錄時,該數字是所包含的目錄條目的數量。
A文件通常硬鏈接計數為 1,但如果使用命令創建硬鏈接,則此情況會發生變化ln
。看Debian 參考手冊。
在您的範例中,為 tempFile2 新增硬連結將增加其連結計數:
ln -l
ln tempFile2 tempHardLink
ln -l
兩個都臨時文件2和臨時硬連結連結計數將為 2。
如果您使用符號連結 ( ln -s tempFile2 tempSymLink
) 進行相同的練習,計數值將不會增加。
A目錄'.'
(連結到自身)及其父目錄中的條目的最小計數為 2 。
在您的範例中,如果您想增加連結計數臨時資料夾,新建一個目錄,數量就會上來。
ls -l tempFolder
mkdir tempFolder/anotherFolder
ls -l tempFolder
連結來自另一個資料夾/到臨時資料夾/(即..
)將被加到計數中。
答案2
在 Unix 上,檔案通常是檔案表中的某個條目。文件有不同類型:常規文件、設備、符號連結、門、管道、套接字、目錄......
inode 號碼(您可以在 的輸出中看到ls -i
)是該表中的索引。
現在,您無法透過以下方式存取文件索引節點但是透過小路。 A小路是一個鏈目錄條目。你會注意到我們不是在談論資料夾但是的目錄這裡。因為它就是目錄(想想電話目錄)。
目錄是一種特殊的文件,它為許多 inode 命名。目錄條目是從名稱到索引節點的對應。
給定檔案(索引節點)可以在一個目錄中擁有多個名稱(就像電話號碼可以有多個名稱一樣),也可以在多個目錄中擁有名稱(條目)。那些被稱為連結,也稱為硬連結來區分軟連結(俚語符號鏈接,這是一種特殊類型的文件,是指向路徑的指標)。
檔案(inode)會追蹤它所擁有的(任何目錄中的條目)連結數量,因此當數量達到 0 時(當它從引用它的最後一個目錄中取消連結時),它就會被釋放。
這就是輸出中顯示的數字(連結數)ls -l
。
當第一次建立非目錄檔案時(使用open
or creat
(或或bind
對於mknod
某些類型的檔案)系統呼叫),它是透過提供新檔案的路徑來完成的(如"/a/b"
)。然後發生的是一個新檔案和索引節點被分配,並且一個新條目被添加到與根目錄"a"
中的名稱關聯的目錄中"/"
。這就是最初的關聯所以連結數是一。
link()
稍後可以透過系統呼叫(命令)添加更多連結ln
。並且可以透過unlink()
系統呼叫(rm
命令)刪除連結。
您會注意到類型的文件目錄一般有大於或等於2的連結數。
現在,當您建立目錄時,您正在呼叫mkdir()
系統呼叫。就像是mkdir("/a/b")
。然後它所做的是分配一個目錄類型的新檔案。在該新目錄中,它會自動建立兩個條目:
"."
(點為了目錄)。這是一個到其自身的連結。所以連結計數現在為 1。".."
(為了目錄的目錄)。這是一個連結到"/a"
.所以 的連結計數"/a"
加一
然後該新目錄被連結到"/a"
(為其添加了一個條目"/a"
),因此它的連結計數現在為2 。"/a/b/c"
".."
"/a/b/c"
"/a/b"
大多數 Unices 限制創建到目錄的進一步鏈接,因為它們可能會導致有問題的循環。當他們確實允許link()
在目錄上執行操作時,通常只有超級用戶才能執行此操作。
有些檔案系統btrfs
偏離了傳統的目錄結構。您會注意到,檔案系統中目錄的連結計數btrfs
始終為 1,即使這些目錄確實包含"."
與其自身 inode 編號相同的條目。
事實上,傳統上連結計數是 2 加上子目錄的數量,這一事實有其用處。例如,在:
find . -name '*.c' -print
if.
不包含子目錄但包含數百萬個檔案。透過查看 的連結數.
,find
可以知道不存在子目錄。因此,所find
要做的就是讀取目錄的內容並報告以 結尾的條目.c
(就像grep '\.c$'
幾兆位元組的文件,沒什麼大不了的)。否則,find
必須檢查每個檔案的類型,以查看是否有目錄可進入其中(導致盡可能多的lstat()
系統呼叫)。當然,這種最佳化不起作用btrfs
(儘管在現代版本的 Linux 中,檔案類型也儲存在某些檔案系統(包括btrfs
)的目錄條目中,並由getdents(2)
用於檢索條目清單的系統呼叫返回在目錄中,所以lstat
仍然沒有必要)。