如何在 Linux 上使用 stat 命令

已發表: 2022-01-29
Ubuntu 風格桌面上的 Linux 終端。
Fatmawati Achmad Zaenuri/Shutterstock.com

Linux stat命令比ls顯示的詳細信息要多得多。 使用這個信息豐富且可配置的實用程序窺探幕後。 我們將向您展示如何使用它。

stat 帶你走進幕後

ls命令非常擅長它所做的事情——而且它做了很多事情——但是對於 Linux,似乎總有一種方法可以更深入地了解表面之下的內容。 通常,這不僅僅是抬起地毯邊緣的情況。 您可以撕開地板,然後挖一個洞。 你可以像剝洋蔥一樣剝 Linux。

10 個適合初學者的基本 Linux 命令
相關10 個適合初學者的基本 Linux 命令

ls將向您顯示有關文件的大量信息,例如對其設置了哪些權限,文件有多大,以及它是文件還是符號鏈接。 為了顯示這些信息, ls從一個稱為 inode 的文件系統結構中讀取它。

每個文件和目錄都有一個 inode。 inode 保存有關文件的元數據,例如它佔用的文件系統塊以及與文件關聯的日期戳。 inode 就像文件的借書證。 但是ls只會顯示一些信息。 要查看所有內容,我們需要使用stat命令。

ls一樣, stat命令有很多選項。 這使它成為使用別名的理想選擇。 一旦你發現了一組特定的選項可以讓stat為你提供你想要的輸出,將它包裝在一個別名或 shell 函數中。 這使它使用起來更加方便,而且您不必記住一組晦澀難懂的命令行選項。

相關:如何在 Linux 上使用 ls 命令列出文件和目錄

快速比較

讓我們使用ls給我們一個長列表( -l選項)和人類可讀的文件大小( -h選項):

 ls -lh ana.h 

廣告

從左到右,ls 提供的信息是:

  • 第一個字符是連字符“-”,這告訴我們該文件是常規文件,而不是套接字、符號鏈接或其他類型的對象。
  • 所有者、組和其他權限以八進制格式列出。
  • 指向此文件的硬鏈接數。 在這種情況下,並且在大多數情況下,它將是一個。
  • 文件所有者是戴夫。
  • 群主是戴夫。
  • 文件大小為 802 字節。
  • 該文件最後一次修改是在 2015 年 12 月 13 日星期五。
  • 文件名為ana.c

讓我們看一下stat

 統計數據

我們從stat得到的信息是:

  • 文件:文件的名稱。 通常,它與我們在命令行中傳遞給stat的名稱相同,但如果我們查看的是符號鏈接,它可能會有所不同。
  • Size :文件的大小(以字節為單位)。
  • Blocks :文件需要的文件系統塊數,以便存儲在硬盤上。
  • IO 塊:文件系統塊的大小。
  • 文件類型:元數據描述的對像類型。 最常見的類型是文件和目錄,但它們也可以是鏈接、套接字或命名管道。
  • Device : 十六進制和十進制的設備號。 這是存儲文件的硬盤驅動器的 ID。
  • 索引節點:索引節點編號。 也就是這個inode的ID號。 inode 號和設備號一起唯一標識一個文件。
  • Links :這個數字表示有多少硬鏈接指向這個文件。 每個硬鏈接都有自己的 inode。 所以考慮這個數字的另一種方法是有多少 inode 指向這個文件。 每次創建或刪除硬鏈接時,此數字都會向上或向下調整。 當它達到零時,文件本身已被刪除,並且 inode 被刪除。 如果在目錄上使用stat ,這個數字代表目錄中的文件數,包括“.”。 當前目錄的條目和父目錄的“..”條目。
  • 訪問:文件權限以八進制和傳統的rwx (讀、寫、執行格式)顯示。
  • Uid :所有者的用戶 ID 和帳戶名。
  • Gid :所有者的組 ID 和帳戶名。
  • 訪問:訪問時間戳。 不像看起來那麼簡單。 現代 Linux 發行版使用一種稱為relatime的方案,它試圖優化更新訪問時間所需的硬盤驅動器寫入。 簡單地說,如果訪問時間早於修改時間,則更新訪問時間。
  • Modify :修改時間戳。 這是文件內容最後一次修改的時間。 (幸運的是,這個文件的內容最後一次更改是四年前到今天。)
  • 更改:更改時間戳。 這是文件的屬性內容最後一次更改的時間。 如果通過設置新的文件權限來修改文件,更改時間戳會更新(因為文件屬性已更改),但修改後的時間戳不會更新(因為文件內容未更改)。
  • Birth :保留以顯示文件的原始創建日期,但這在 Linux 中沒有實現。

了解時間戳

時間戳對時區敏感。 每行末尾的-0500表示此文件是在比當前計算機的時區早 5 小時的協調世界時 (UTC) 時區的計算機上創建的。 所以這台電腦比創建這個文件的電腦晚了五個小時。 事實上,該文件是在英國時區計算機上創建的,我們在美國東部標準時區的計算機上查看它。

修改和更改時間戳可能會引起混淆,因為對於外行來說,它們的名稱聽起來好像它們的意思是一樣的。

讓我們使用chmod來修改名為ana.c的文件的文件權限。 我們將使它對每個人都可寫。 這不會影響文件的內容,但會影響文件的屬性。

 chmod +w ana.c

然後我們將使用stat查看時間戳:

 統計分析.c 

廣告

更改時間戳已更新,但修改後的時間戳尚未更新。

僅當文件內容髮生更改時,才會更新修改後的時間戳。 更改時間戳會針對內容更改和屬性更改進行更新。

對多個文件使用 Stat

要一次對多個文件進行 stat 報告,請在命令行上將文件名傳遞給stat

 統計 ana.h ana.o 

要對一組文件使用stat ,請使用模式匹配。 問號“?” 表示任意單個字符,星號“*”表示任意字符串。 我們可以使用以下命令告訴stat報告任何名為“ana”且具有單個字母擴展名的文件:

 統計數據。? 

使用 stat 報告文件系統

stat可以報告文件系統的狀態,以及文件的狀態。 -f (文件系統)選項告訴stat報告文件所在的文件系統。 請注意,我們還可以將諸如“/”之類的目錄而不是文件名傳遞給stat

 stat -f ana.c 

stat給我們的信息是:

  • 文件:文件的名稱。
  • ID :以十六進製表示的文件系統 ID。
  • Namelen :文件名的最大允許長度。
  • 類型:文件系統的類型。
  • 塊大小:請求讀取請求以獲得最佳數據傳輸速率的數據量。
  • 基本塊大小:每個文件系統塊的大小。

塊:

  • Total :文件系統中所有塊的總數。
  • Free :文件系統中的空閒塊數。
  • 可用:普通(非 root)用戶可用的空閒塊數。

索引節點:

  • Total :文件系統中的 inode 總數。
  • Free :文件系統中的空閒 inode 數量。

取消引用符號鏈接

如果您在實際上是符號鏈接的文件上使用stat ,它將報告該鏈接。 如果您希望stat報告鏈接指向的文件,請使用-L (取消引用)選項。 文件code.cana.c的符號鏈接。 讓我們看一下沒有-L選項的情況:

 統計代碼.c 

廣告

文件名顯示code.c指向 ( -> ) ana.c 。 文件大小只有 11 個字節。 有零個塊專門用於存儲此鏈接。 文件類型被列為符號鏈接。

顯然,我們在這裡查看的不是實際文件。 讓我們再次這樣做並添加-L選項:

 stat -L code.c 

現在顯示符號鏈接指向的文件的文件詳細信息。 但請注意,文件名仍為code.c 。 這是鏈接的名稱,而不是目標文件。 發生這種情況是因為這是我們在命令行stat的名稱。

簡短的報告

-t (簡潔)選項使stat提供簡明摘要:

 stat -t ana.c 

沒有給出任何線索。 為了理解它——直到你記住了字段序列——你需要交叉引用這個輸出到一個完整的stat輸出。

自定義輸出格式

stat獲取不同數據集的更好方法是使用自定義格式。 有一長串稱為格式序列的標記。 這些中的每一個都代表一個數據元素。 選擇要包含在輸出中的那些並創建格式字符串。 當我們調用stat並將格式字符串傳遞給它時,輸出將只包含我們請求的數據元素。

廣告

文件和文件系統有不同的格式序列集。 文件列表如下:

  • %a :八進制的訪問權限。
  • %A :人類可讀形式的訪問權限( rwx )。
  • %b :分配的塊數。
  • %B :每個塊的大小(以字節為單位)。
  • %d : 十進制的設備號。
  • %D : 十六進制的設備號。
  • %f : 十六進制的原始模式。
  • %F文件類型。
  • %g : 所有者的組 ID。
  • %G :所有者的組名。
  • %h : 硬鏈接數。
  • %i :inode 編號。
  • %m : 掛載點。
  • %n : 文件名。
  • %N :引用的文件名,如果是符號鏈接,則使用取消引用的文件名。
  • %o :最佳 I/O 傳輸大小提示。
  • %s :總大小,以字節為單位。
  • %t : 十六進制的主要設備類型,用於字符/塊設備特殊文件。
  • %T :十六進制的次要設備類型,用於字符/塊設備特殊文件。
  • %u : 所有者的用戶 ID。
  • %U :所有者的用戶名。
  • %w :文件誕生的時間,人類可讀的,如果未知,則為連字符“-”。
  • %W :文件誕生的時間,自 Epoch 以來的秒數; 0 如果未知。
  • %x :上次訪問的時間,可讀。
  • %X :上次訪問的時間,自 Epoch 以來的秒數。
  • %y :最後一次數據修改的時間,可讀。
  • %Y :最後一次數據修改的時間,自 Epoch 以來的秒數。
  • %z :上次狀態變化的時間,可讀。
  • %Z :上次狀態更改的時間,自 Epoch 以來的秒數。

“紀元”是 Unix 紀元,發生在 1970-01-01 00:00:00 +0000 (UTC)。

對於文件系統,格式序列是:

  • %a :普通(非root)用戶可用的空閒塊數。
  • %b :文件系統中的總數據塊。
  • %c :文件系統中的總 inode。
  • %d : 文件系統中空閒 inode 的數量。
  • %f :文件系統中的空閒塊數。
  • %i : 十六進制的文件系統 ID。
  • %l : 文件名的最大長度。
  • %n : 文件名。
  • %s :塊大小(最佳寫入大小)。
  • %S :文件系統塊的大小(用於塊計數)。
  • %t : 十六進制的文件系統類型。
  • %T :人類可讀形式的文件系統類型。

有兩個選項可以接受格式序列的字符串。 它們是--format--printf 。 它們之間的區別在於--printf解釋 C 樣式的轉義序列,例如換行符\n和製表符\t ,並且它不會自動在其輸出中添加換行符。

讓我們創建一個格式字符串並將其傳遞給stat 。 將使用的格式序列是文件名的%n ,文件大小的%s和文件類型的%F 。 我們將在字符串末尾添加\n轉義序列,以確保在新行上處理每個文件。 我們的格式字符串如下所示:

 "文件 %n 是 %s 字節,並且是 %F\n"

我們將使用--printf選項將其傳遞給stat 。 我們將要求stat報告一個名為code.c的文件和一組與ana.? . 這是完整的命令。 注意--printf和格式字符串之間的等號“ = ”:

 stat --printf="文件 %n 是 %s 字節,並且是 %F\n" code.c ana/ana.? 

每個文件的報告都列在新行上,這是我們要求的。 為我們提供了文件名、文件大小和文件類型。

廣告

自定義格式使您可以訪問比標準stat輸出中包含的更多的數據元素。

細粒控制

如您所見,提取您感興趣的特定數據元素的空間很大。 您可能還可以看到為什麼我們建議為更長和更複雜的咒語使用別名。

相關:適合開發人員和愛好者的最佳 Linux 筆記本電腦