在Linux下文件的三種時間標記:訪問時間、修改時間、狀態改動時間

在windows下,一個文件有:創建時間、修改時間、訪問時間。
在Linux下,一個文件也有三種時間,分別是:訪問時間、修改時間、狀態改動時間

兩者有此不同,在Linux下沒有創建時間的概念,也就 是不能知道文件的建立時間,但如果文件建立後就沒有修改過,修改時間=建立時間;如果文件建立後,狀態就沒有改動過,那麼狀態改動時間=建立時間;如果文 件建立後,沒有被讀取過,那麼訪問時間=建立時間,因爲不好判斷文件是否被改過、讀過、其狀態是否變過,所以判斷文件的建立時間基本上能爲不可能。
 
如何查一個文件的三個時間呢?
先用下面的命令來建立一個文件
# date && echo "this is file be used test time of file" >filetime.txt && ll --full-time filetime.txt
Tue Aug  4 15:13:44 HKT 2009
-rw-r--r--    1 root     root           39 2009-08-04 15:13:44.000000000 +0800 filetime.txt
 
通過stat filename.txt來查,如:
# stat filetime.txt 
  File: `filetime.txt'
  Size: 39              Blocks: 8          IO Block: 4096   Regular File
Device: 802h/2050d      Inode: 17          Links: 1    
Access: (0644/-rw-r--r--)  Uid: (    0/    root)   Gid: (    0/    root)
Access: 2009-08-04 15:13:44.000000000 +0800
Modify: 2009-08-04 15:13:44.000000000 +0800
Change: 2009-08-04 15:13:44.000000000 +0800


說明:Access訪問時間。Modify修改時間。Change狀態改動時間。可以stat *查看這個目錄所有文件的狀態。
ctime=change time
atime=access time
mtime=modifiy time
 
因爲這是一個新的文件(filetime.txt),沒做過內容、屬性的更改,也沒讀過這個文件,所以三者(訪問時間、修改時間、狀態改動時間)的時間是一致的,這時文件的修改時間與這三個時間是一樣的,是沒有疑問的。
 
1、訪問時間,讀一次這個文件的內容,這個時間就會更新。比如對這個文件運用 more、cat等命令。ls、stat命令都不會修改文件的訪問時間。
2、修改時間,修改時間是文件內容最後一次被修改時間。比如:vi後保存文件。ls -l列出的時間就是這個時間。
3、狀態改動時間。是該文件的i節點最後一次被修改的時間,通過chmod、chown命令修改一次文件屬性,這個時間就會更新。
 
另個除了可以通過stat來查看文件的mtime,ctime,atime等屬性,也可以通過ls命令來查看,具體如下:
ls -lc filename 列出文件的 ctime (最後更改時間)
ls -lu filename 列出文件的 atime(最後存取時間)

ls -l filename 列出文件的 mtime (最後修改時間)
 
在linux中stat函數中,用st_atime表示文件數據最近的存取時間(last accessed time);用st_mtime表示文件數據最近的修改時間(last modified time);使用st_ctime表示文件i節點數據最近的修改時間(last i-node's status changed time)。
 
 字段           說明                  例子           ls(-l)
 st_atime  文件數據的最後存取時間       read            -u
 st_mtime  文件數據的最後修改時間       write           缺省
 st_ctime  文件數據的最後更改時間       chown,chmod     -c
 
 
在linux系統中,系統把文件內容數據與i節點數據是分別存放的,i節點數據存放了文件權限與文件屬主之類的數據。
 
另外,可以格式化輸出文件的三種時間,如:
find . -name file -printf "%AY-%Am-%Ad %AH:%AM:%AS"
find . -name file -printf "%TY-%Tm-%Td %TH:%TM:%TS"
find . -name file -printf "%CY-%Cm-%Cd %CH:%CM:%CS"
 
linux的ctime代表的是文件修改時間,如果文件被修改過就很難知道文件的創建時間,在某些特殊情況下,需要查看文件的創建時間,正常情況下查看文件的ctime是無法實現的。可以使用一個變通的方法來實現保留文件創建時間,但是同時也會犧牲一些其它特性。
 
可以在mount文件的時候使用參數-o noatime,來把系統更新atime的特性關閉。使用了noatime參數掛載後,在文件被修改後文件的atime是不會被改變的,使用stat查看到的atime就是文件的創建時間。
如:
# / sbin/mkfs -t ext3 /dev/ram10
# mount -t ext3 -o noatime /dev/loop0 /mnt/foo
# mount
/dev/ram10 on /mnt/foo type ext3 (rw,noatime)
# cd /mnt/foo
# touch filetime1.txt
# stat filetime1.txt 
  File: `filetime1.txt'
  Size: 0               Blocks: 0          IO Block: 4096   Regular File
Device: 10ah/266d       Inode: 12          Links: 1    
Access: (0644/-rw-r--r--)  Uid: (    0/    root)   Gid: (    0/    root)
Access: 2009-08-04 20:51:32.000000000 +0800
Modify: 2009-08-04 20:51:32.000000000 +0800
Change: 2009-08-04 20:51:32.000000000 +0800
 
# echo foo.ok >> filetime1.txt 
[root@logs-bak foo]# stat filetime1.txt 
  File: `filetime1.txt'
  Size: 14              Blocks: 2          IO Block: 4096   Regular File
Device: 10ah/266d       Inode: 12          Links: 1    
Access: (0644/-rw-r--r--)  Uid: (    0/    root)   Gid: (    0/    root)
Access: 2009-08-04 20:51:32.000000000 +0800
Modify: 2009-08-04 20:53:27.000000000 +0800
Change: 2009-08-04 20:53:27.000000000 +0800
 
# cat filetime1.txt 
  foo.ok
#stat filetime1.txt 
  File: `filetime1.txt'
  Size: 14              Blocks: 2          IO Block: 4096   Regular File
Device: 10ah/266d       Inode: 12          Links: 1    
Access: (0644/-rw-r--r--)  Uid: (    0/    root)   Gid: (    0/    root)
Access: 2009-08-04 20:51:32.000000000 +0800
Modify: 2009-08-04 20:53:27.000000000 +0800
Change: 2009-08-04 20:53:27.000000000 +0800
 
# 通過以上實驗可以看出文件的access time 是不變的。
 
接着向下多測試一下.
# vi filetime1.txt
# stat filetime1.txt 
  File: `filetime1.txt'
  Size: 23              Blocks: 2          IO Block: 4096   Regular File
Device: 10ah/266d       Inode: 14          Links: 1    
Access: (0644/-rw-r--r--)  Uid: (    0/    root)   Gid: (    0/    root)
Access: 2009-08-04 20:55:05.000000000 +0800
Modify: 2009-08-04 20:55:05.000000000 +0800
Change: 2009-08-04 20:55:05.000000000 +0800
 
# chmod 777 filetime1.txt 
# stat filetime1.txt 
  File: `filetime1.txt'
  Size: 23              Blocks: 2          IO Block: 4096   Regular File
Device: 10ah/266d       Inode: 14          Links: 1    
Access: (0777/-rwxrwxrwx)  Uid: (    0/    root)   Gid: (    0/    root)
Access: 2009-08-04 20:55:05.000000000 +0800
Modify: 2009-08-04 20:55:05.000000000 +0800
Change: 2009-08-04 20:57:36.000000000 +0800
可見,chmod後,Ctime的變化。
#########################################################
說到這裏,大概大家也對在linux下文件的時間有所瞭解了吧!
那麼以下的操作對文件的時間有什麼影響呢?
 
操作                        atime        mtime       ctime
----------------------------------------------------------
mv
----------------------------------------------------------
cp
----------------------------------------------------------
touch
----------------------------------------------------------
cat/more/less
----------------------------------------------------------
ls
----------------------------------------------------------
chmod/chown
----------------------------------------------------------
ln
----------------------------------------------------------
echo
----------------------------------------------------------
vi
----------------------------------------------------------
(請大家測試完成這個表吧!!!!做完測試可以給我留言啊!)
##############################################################
 
另外,從kernel2.6.29開,還默認集成了一個relatime的屬性。可能是因爲在文件讀操作很頻繁的系統
中,atime更新所帶來的開銷很大,所以很多SA都在掛裝文件系統的時候使用noatime屬性來停止更新atime。但是有些程序需要根據atime進行一些判斷和操作,所以Linux就推出了一個relatime特性。
使 用這個特性來掛裝文件系統後,只有當mtime比atime更新的時候,纔會更新atime。事實上,這個時候atime和mtime已經是同一個東西 了。所以這個選項就是爲了實現對atime的兼容才推出的。並不是一個新的時間屬性。使用方法就是通過mount -o relatime /dir來掛裝目錄。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章