ls -l 指令輸出中檔案權限和擁有者之間的數字是多少?

ls -l 指令輸出中檔案權限和擁有者之間的數字是多少?

命令的輸出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

當第一次建立非目錄檔案時(使用openor 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仍然沒有必要)。

相關內容