Linux下檔案的三種時間標記 在windows下,一個檔案有:建立時間、修改時間、訪問時間。而在Linux下,一個檔案也有三種時間,分別是:訪問時間、修改時間、狀態改動時間。 www.2cto.com 兩者有此不同,在Linux下沒有建立時間的概念,也就 是不能知道檔案的建立時間,但如果檔案建立後就沒有修改過,修改時間=建立時間;如果檔案建立後,狀態就沒有改動過,那麼狀態改動時間=建立時間;如果文 件建立後,沒有被讀取過,那麼訪問時間=建立時間,因為不好判斷檔案是否被改過、讀過、其狀態是否變過,所以判斷檔案的建立時間基本上能為不可能。 如何查一個檔案的三個時間呢?先用下面的命令來建立一個檔案# date && echo "this is file be used test time of file" >filetime.txt && ll --full-time filetime.txtTue 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 FileDevice: 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 +0800Modify: 2009-08-04 15:13:44.000000000 +0800Change: 2009-08-04 15:13:44.000000000 +0800 說明:Access訪問時間。Modify修改時間。Change狀態改動時間。可以stat *查看這個目錄所有檔案的狀態。ctime=change timeatime=access timemtime=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 FileDevice: 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 +0800Modify: 2009-08-04 20:51:32.000000000 +0800Change: 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 FileDevice: 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 +0800Modify: 2009-08-04 20:53:27.000000000 +0800Change: 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 FileDevice: 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 +0800Modify: 2009-08-04 20:53:27.000000000 +0800Change: 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 FileDevice: 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 +0800Modify: 2009-08-04 20:55:05.000000000 +0800Change: 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 FileDevice: 10ah/266d Inode: 14 Links: 1 Access: (0777/-rwxrwxrwx) Uid: ( 0/ root) Gid: ( 0/ root)Access: 2009-08-04 20:55:05.000000000 +0800Modify: 2009-08-04 20:55:05.000000000 +0800Change: 2009-08-04 20:57:36.000000000 +0800可見,chmod後,Ctime的變化。############################################################## 另外,從kernel2.6.29開,還預設整合了一個relatime的屬性。可能是因為在檔案讀操作很頻繁的系統中,atime更新所帶來的開銷很大,所以很多SA都在掛裝檔案系統的時候使用noatime屬性來停止更新atime。但是有些程式需要根據atime進行一些判斷和操作,所以Linux就推出了一個relatime特性。使 用這個特性來掛裝檔案系統後,只有當mtime比atime更新的時候,才會更新atime。事實上,這個時候atime和mtime已經是同一個東西 了。所以這個選項就是為了實現對atime的相容才推出的。並不是一個新的時間屬性。使用方法就是通過mount -o relatime /dir來掛裝目錄。