1. 程式人生 > >Linux系統stat指令用法

Linux系統stat指令用法

時也 eas nodes 用法 nbsp 索引 noatime 文件權限 信息

stat指令:文件/文件系統的詳細信息顯示。

stat命令主要用於顯示文件或文件系統的詳細信息,該命令的語法格式如下:

stat命令-->用來顯示文件的詳細信息,包括inode, atime, mtime, ctime

適用場景:

查看文件或目錄的諸如atime,mtime,ctime等信息即可使用stat命令,也可使用ls命令,但相比而言,stat還可以看到設備號,環境等信息。

技術分享圖片

備註:

1) stat常用輸出示意圖:

技術分享圖片

2) 用於查看atime,mtime,ctime的ls命令用法:

技術分享圖片

3) stat命令的幾點說明:

技術分享圖片

-f  不顯示文件本身的信息,顯示文件所在文件系統的信息

-L  顯示符號鏈接

-C 文件權限

-t  簡潔模式,只顯示摘要信息

  事實上,stat命令顯示的是文件的I節點信息。Linux文件系統以塊為單位存儲信息,為了找到某一個文件所在存儲空間的位置,用I節點對每個文件進行索引。

    所謂的I節點,是文件系統管理的一個數據結構,是一個64字節長的表,包含了描述文件所必要的全部信息,其中包含了文件的大小,類型,存取權限,文件的所有者

查詢rc.d文件的信息

[root@redhat rc.d]# stat rc0.d/  //可以清楚的分析文件或目錄的信息
File: `rc0.d/‘
Size: 4096 Blocks: 8 IO Block: 4096 directory
Device: fd00h/64768d Inode: 1309217 Links: 2
Access: (0755/drwxr-xr-x) Uid: ( 0/ root) Gid: ( 0/ root)
Access: 2014-06-26 21:02:26.776082938 +0800
Modify: 2014-06-12 15:16:57.848087079 +0800
Change: 2014-06-12 15:16:57.848087079 +0800

[root@redhat rc0.d]# du -sh   //這個目錄下的所有文件共4K和上面大小差不多
4.0K .

查詢ec.d文件所在文件系統的信息:

[root@redhat rc.d]# stat -f rc0.d/  //這個顯示的跟當前系統的文件系統信息一樣,因為rc.0就在當前系統的文件系統
File: "rc0.d/"
ID: 303116b72802c784 Namelen: 255 Type: ext2/ext3
Block size: 4096 Fundamental block size: 4096
Blocks: Total: 7558388 Free: 5545748 Available: 5161800
Inodes: Total: 1921360 Free: 1850717

也可以查看硬盤的信息

[root@redhat rc.d]# stat /dev/sda
File: `/dev/sda‘
Size: 0 Blocks: 0 IO Block: 4096 block special file
Device: 5h/5d Inode: 6308 Links: 1 Device type: 8,0
Access: (0660/brw-rw----) Uid: ( 0/ root) Gid: ( 6/ disk)
Access: 2014-06-27 20:57:07.213940088 +0800
Modify: 2014-06-27 20:57:05.037938949 +0800
Change: 2014-06-27 20:57:05.037938949 +0800

sda硬盤文件系統的信息

[root@redhat rc.d]# stat -f /dev/sda
File: "/dev/sda"
ID: 0 Namelen: 255 Type: tmpfs
Block size: 4096 Fundamental block size: 4096
Blocks: Total: 61793 Free: 61734 Available: 61734
Inodes: Total: 61793 Free: 61080

Linux下使用stat命令所顯示出來的三個時間

#1. [root@localhost tmp]# stat 1.txt

File: `1.txt‘
Size: 8 Blocks: 8 IO Block: 4096 regular file
Device: 802h/2050d Inode: 196617 Links: 1
Access: (0644/-rw-r--r--) Uid: ( 0/ root) Gid: ( 0/ root)
Access: 2013-10-20 21:43:54.000000000 +0800
Modify: 2013-10-20 21:35:42.000000000 +0800
Change: 2013-10-20 21:35:42.000000000 +0800

#2. stat顯示出inode的內容--inode包含文件的元信息,具體來說有以下內容:
  * 文件的字節數
  * 文件擁有者的User ID
  * 文件的Group ID
  * 文件的讀、寫、執行權限
  * 文件的時間戳,共有三個
  * 鏈接數,即有多少文件名指向這個inode
  * 文件數據block的位置

#3. IO Block:邏輯塊的大小為4096個字節
Blocks:物理最小塊是512,而IO Block為4096,所以這裏就占用了8個物理塊的意思
Access:atime
Modify:mtime,修改時間,註意這個不是建立時間,m不是make的意思
Change:ctime,改變時間

#4. 通過ls怎麽查詢這三個時間?
ls -lc filename 列出文件的 ctime
ls -lu filename 列出文件的 atime
ls -l filename 列出文件的 mtime --ll默認顯示的就是這個時間

#5. 這三個時間不好區別,但必須區別好,因為很多應用會考慮到這些時間,比如在做同步備份時,會判斷時間,大於上次備份時間的文件要再次同步等,或在查找文件何時變化,何時被黑客入侵,都會用到這個。
atime:訪問時間,讀取文件或者執行文件時會更改,命令如cat,vi
mtime:修改時間,文件的內容被改變時,就會更改,如vi
ctime:改變時間,文件的標簽如屬性、用戶、用戶組、權限、內容等被改變時,就會更改,如chmod,chown,vi

#6. 文件的時間戳(timestamp)是inode的內容之一,從inode來理解:ctime指inode上一次改變的時間,mtime指文件內容上一次修改的時間,atime指文件上一次打開的時間。

#7. atime不一定在訪問文件之後被修改,因為:使用ext3文件系統的時候,如果在mount的時候使用了noatime參數那麽就不會更新atime的信息,就是不想filesystem做太多的修改,而改善讀取效能。

在linux系統下,使用stat(顯示inode信息)命令可以查看一個文件的某些信息,我們先來嘗試一下。
技術分享圖片
簡單的介紹一下stat命令顯示出來的文件其他信息:
- File:顯示文件名
- Size:顯示文件大小
- Blocks:文件使用的數據塊總數
- IO Block:IO塊大小
- regular file:文件類型(常規文件)
- Device:設備編號
- Inode:Inode號
- Links:鏈接數
- Access:文件的權限
- Gid、Uid:文件所有權的Gid和Uid。

Linux下的三個時間:
1. Access Time:簡寫為atime,表示文件的訪問時間。當文件內容被訪問時,更新這個時間
2. Modify Time:簡寫為mtime,表示文件內容的修改時間,當文件的數據內容被修改時,更新這個時間。
3. Change Time:簡寫為ctime,表示文件的狀態時間,當文件的狀態被修改時,更新這個時間,例如文件的鏈接數,大小,權限,Blocks數。

上面最開始的三個時間是一模一樣的,原因是我在創建它的同時修改了它的內容,所以它的大小,Blocks也發生變化,也相當於一次訪問,所以,我退出保存後三個時間一致。

下面進行一一驗證。

1.atime(訪問時間)的更新
技術分享圖片
2.mtime(修改時間)的更新
技術分享圖片
這裏我使用echo指令向hello.cpp文件中寫入了一行內容,驚訝的發現,不止mtime被更新了,而且ctime也被更新了。這是問什麽呢?原因很簡單,前面說過,ctime在文件大小,Blocks發生變化時也會被更新,所以仔細觀察上圖,這兩項信息是否發生變化了呢?
3.ctime(狀態時間)的更新

技術分享圖片
使用chmod指令修改hello.cpp的文件權限後,狀態時間再次更新。
那如果不采取這些操作導致系統自己更新這三個時間,有沒有辦法人為改變這三個時間呢?答案是有的,請繼續往下看~

touch命令
我們都知道touch命令是用來創建文件的,其實它的用法還有一個,就是修改文件的時間戳。
用法:
-a 或–time=atime或–time=access或–time=use 只更改訪問時間。
-m 或–time=mtime或–time=modify  只更改修改時間
-d、-t  使?指定的?期時間,??現在的時間
我們來試一試:
技術分享圖片
通過上圖可以發現,我只是通過-a選項試圖修改hello.cpp的訪問時間,結果ctime(狀態時間)也發生了改變。雖然實際上我用touch操作只改變了atime,但是由於文件的狀態發生了變化,所以ctime就自己更新了。
技術分享圖片
沒錯,和上面一樣,我只是通過-m選項改了文件的修改時間,ctime依然更新了。touch指令依然只是修改了修改時間,而狀態時間是系統自己更新的。

Linux系統stat指令用法