天天看點

stat -- 擷取比 ls 更多的資訊stat -- 擷取比 ls 更多的資訊

厭倦了 ls 指令,并且想檢視更多有關你的檔案的有趣的資訊? 試一試 stat!
stat -- 擷取比 ls 更多的資訊stat -- 擷取比 ls 更多的資訊

ls 指令可能是每一個 unix 使用者第一個學習的指令之一, 但它僅僅顯示了 stat 指令能給出的資訊的一小部分。

stat 指令從檔案的索引節點擷取資訊。 正如你可能已經了解的那樣, 每一個系統裡的檔案都存有三組日期和時間, 它們包括最近修改時間(即使用 ls -l 指令時顯示的日期和時間), 最近狀态改變時間(包括對檔案重命名)和最近通路時間。

使用長清單模式檢視檔案資訊, 你會看到類似下面的内容:

$ ls -l trythis

-rwx------ 1 shs unixdweebs 109 nov 11 2013 trythis

使用 stat 指令, 你會看到下面這些:

$ stat trythis

file: `trythis'

size: 109 blocks: 8 io block: 262144 regular file

device: 18h/24d inode: 12731691 links: 1

access: (0700/-rwx------) uid: ( 263/ shs) gid: ( 100/ unixdweebs)

access: 2014-09-09 19:27:58.000000000 -0400

modify: 2013-11-11 08:40:10.000000000 -0500

change: 2013-11-11 08:40:10.000000000 -0500

在上面的情形中, 檔案的狀态改變和檔案修改的日期/時間是相同的, 而通路時間則是相當近的時間。 我們還可以看到檔案使用了 8 個塊, 以及兩種格式顯示的檔案權限 -- 八進制(0700)格式和 rwx 格式。 在第三行顯示的索引節點是 12731681. 檔案沒有其它的硬連結(links: 1)。 而且, 這個檔案是一個正常檔案。

把檔案重命名, 你會看到狀态改變時間發生變化。

這裡的 ctime 資訊, 最早設計用來存儲檔案的建立(create)日期和時間, 但後來不知道什麼時候變為用來存儲狀态修改(change)時間。

$ mv trythis trythat

$ stat trythat

file: `trythat'

change: 2014-09-21 12:46:22.000000000 -0400

改變檔案的權限也會改變 ctime 域。

你也可以配合通配符來使用 stat 指令以列出一組檔案的狀态:

$ stat myfile*

file: `myfile'

size: 20 blocks: 8 io block: 262144 regular file

device: 18h/24d inode: 12731803 links: 1

access: (0640/-rw-r-----) uid: ( 263/ shs) gid: ( 100/ unixdweebs)

access: 2014-08-23 03:00:36.000000000 -0400

modify: 2014-08-22 12:02:12.000000000 -0400

change: 2014-08-22 12:02:12.000000000 -0400

file: `myfile2'

device: 18h/24d inode: 12731806 links: 1

modify: 2014-08-22 12:03:30.000000000 -0400

change: 2014-08-22 12:03:30.000000000 -0400

file: `myfile3'

size: 40 blocks: 8 io block: 262144 regular file

device: 18h/24d inode: 12730533 links: 1

modify: 2014-08-22 12:03:59.000000000 -0400

change: 2014-08-22 12:03:59.000000000 -0400

如果我們喜歡的話, 我們也可以通過其他指令來擷取這些資訊。

向 ls -l 指令添加 "u" 選項, 你會看到下面的結果。 注意這個選項會顯示最後通路時間, 而添加 "c" 選項則會顯示狀态改變時間(在本例中, 是我們重命名檔案的時間)。

$ ls -lu trythat

-rwx------ 1 shs unixdweebs 109 sep 9 19:27 trythat

$ ls -lc trythat

-rwx------ 1 shs unixdweebs 109 sep 21 12:46 trythat

stat 指令也可應用與檔案夾。

在這個例子中, 我們可以看到有許多的連結。

$ stat bin

file: `bin'

size: 12288 blocks: 24 io block: 262144 directory

device: 18h/24d inode: 15089714 links: 9

access: (0700/drwx------) uid: ( 263/ shs) gid: ( 100/ unixdweebs)

access: 2014-09-21 03:00:45.000000000 -0400

modify: 2014-09-15 17:54:41.000000000 -0400

change: 2014-09-15 17:54:41.000000000 -0400

在這裡, 我們還可以檢視一個檔案系統。

$ stat -f /dev/cciss/c0d0p2

file: "/dev/cciss/c0d0p2"

id: 0 namelen: 255 type: tmpfs

block size: 4096fundamental block size: 4096

blocks: total: 259366 free: 259337 available: 259337

inodes: total: 223834 free: 223531

注意 namelen (檔案名長度)域, 如果檔案名長于 255 個字元的話, 你會很幸運地在檔案名處看到心形符号!

stat 指令還可以一次顯示所有我們想要的資訊。 下面的例子中, 我們隻想檢視檔案類型, 然後是硬連接配接數。

$ stat --format=%f trythat

regular file

$ stat --format=%h trythat

1

在下面的例子中, 我們檢視了檔案權限 -- 分别以兩種可用的格式 -- 然後是檔案的 selinux 安全環境。最後,我們我們可以以從 epoch 開始的秒數格式來檢視檔案通路時間。

$ stat --format=%a trythat

700

-rwx------

$ stat --format=%c trythat

(null)

$ stat --format=%x bin

1411282845

下面全部是可用的選項:

%a 八進制表示的通路權限

%a 可讀格式表示的通路權限

%b 配置設定的塊數(參見 %b)

%b %b 參數顯示的每個塊的位元組數

%d 十進制表示的裝置号

%d 十六進制表示的裝置号

%f 十六進制表示的 raw 模式

%f 檔案類型

%g 屬主的組 id

%g 屬主的組名

%h 硬連接配接數

%i inode 号

%n 檔案名

%n 如果是符号連結,顯示器所連結的檔案名

%o i/o 塊大小

%s 全部占用的位元組大小

%t 十六進制的主裝置号

%t 十六進制的副裝置号

%u 屬主的使用者 id

%u 屬主的使用者名

%x 最後通路時間

%x 最後通路時間,自 epoch 開始的秒數

%y 最後修改時間

%y 最後修改時間,自 epoch 開始的秒數

%z 最後改變時間

%z 最後改變時間,自 epoch 開始的秒數

針對檔案系統還有如下格式選項:

%a 普通使用者可用的塊數

%b 檔案系統的全部資料塊數

%c 檔案系統的全部檔案節點數

%d 檔案系統的可用檔案節點數

%f 檔案系統的可用節點數

%c selinux 的安全上下文

%i 十六進制表示的檔案系統 id

%l 檔案名的最大長度

%n 檔案系統的檔案名

%s 塊大小(用于更快的傳輸)

%s 基本塊大小(用于塊計數)

%t 十六進制表示的檔案系統類型

%t 可讀格式表示的檔案系統類型

這些資訊都可以得到,stat 指令也許可以幫你以稍微不同的角度來了解你的檔案。

原文釋出時間:2014-10-23

本文來自雲栖合作夥伴“linux中國”