檢視檔案時間戳指令:stat awk.txt
File: `awk.txt'
Size: 20 Blocks: 8 IO Block: 4096 regular file
Device: 801h/2049d Inode: 380730 Links: 1
Access: (0644/-rw-r--r--) Uid: ( 0/ root) Gid: ( 0/ root)
Access: 2008-04-26 01:50:44.000000000 +0800
Modify: 2008-04-26 01:48:18.000000000 +0800
Change: 2008-04-26 01:48:18.000000000 +0800
說明:Access通路時間。Modify修改時間。Change狀态改變時間。可以stat *檢視這個目錄所有檔案的狀态。
現在是要過濾出Modify的時間戳,并以yyyyMMddHHSS格式儲存,則可以利用下面這條指令:
stat awk.txt | grep -i Modify | awk -F. '{print $1}' | awk '{print $2$3}'| awk -F- '{print $1$2$3}' | awk -F: '{print $1$2$3}'
輸出結果:20080426014818
修改檔案時間與建立新檔案:touch
在介紹ls指令時,提到每個檔案在Linux下面都會記錄3個主要的修改時間:
• modification time(mtime,修改時間):當該檔案的“内容資料”更改時,就會更新這個時間。内容資料指的是檔案的内容,而不是檔案的屬性。
• status time(ctime,狀态時間):當該檔案的”狀态(status)”改變時,就會更新這個時間,舉例來說,更改了權限與屬性,就會更新這個時間。
• access time(atime,存取時間):當“取用檔案内容”時,就會更新這個讀取時間。舉例來說,使用cat去讀取 ~/.bashrc,就會更新atime了。
舉例來說,我們來看一看/etc/man.config檔案的時間。
[root@linux ~]# ls -l /etc/man.config
-rw-r--r-- 1 root root 4506 Apr 8 19:11 /etc/man.config
[root@linux ~]# ls -l --time=atime /etc/man.config
-rw-r--r-- 1 root root 4506 Jul 19 17:53 /etc/man.config
[root@linux ~]# ls -l --time=ctime /etc/man.config
-rw-r--r-- 1 root root 4506 Jun 25 08:28 /etc/man.config
看到了嗎?在預設的情況下,ls顯示的是該檔案的mtime,也就是這個檔案的内容上次更改的時間。我的系統是在6/25安裝的,是以,這個檔案産生但狀态更改的時間就回溯到那個時間點。因為剛才的範例中使用到這個檔案,是以,它的atime就會變成剛剛使用的時間了。
檔案的時間很重要,因為如果誤判檔案時間,可能會造成某些程式無法順利運作。那麼,萬一我發現了一個檔案來自将來(很多時候會有這個問題的。我們在安裝的時候,提到的GMT時間就是那個意思),該如何讓該檔案的時間變成“現在”的時刻呢?很簡單,用touch指令即可。
[root@linux ~]# touch [-acdmt] 檔案
參數:
-a : 僅修改access time。
-c : 僅修改時間,而不建立檔案。
-d : 後面可以接日期,也可以使用 --date="日期或時間"
-m : 僅修改mtime。
-t : 後面可以接時間,格式為 [YYMMDDhhmm]
範例:
範例一:建立一個空的檔案。
[root@linux ~]# cd /tmp
[root@linux tmp]# touch testtouch
[root@linux tmp]# ls -l testtouch
-rw-r--r-- 1 root root 0 Jul 19 20:49 testtouch
# 注意,這個檔案的大小是0。在預設的狀态下,如果touch後面接檔案,
# 則該檔案的3個時間(atime/ctime/mtime)都會更新為目前時間。若該檔案不存在,
# 則會主動建立一個新的空檔案。例如上面這個例子。
範例二:将 ~/.bashrc複制成為bashrc,假設複制完全的屬性,檢查其日期。
[root@linux tmp]# cp ~/.bashrc bashrc
[root@linux tmp]# ll bashrc; ll --time=atime bashrc; ll --time=ctime bashrc
-rwxr-xr-x 1 root root 395 Jul 4 11:45 bashrc <==這是mtime
-rwxr-xr-x 1 root root 395 Jul 19 20:44 bashrc <==這是atime
-rwxr-xr-x 1 root root 395 Jul 19 20:53 bashrc <==這是ctime
# 在這個案例中,我們使用了 ; 指令分隔符,它的用法我們會在Bash shell中提到。
# 此外,ll是ls -l的指令别名,這個也會在bash shell中再次提及,
# 目前可以簡單地想成,ll就是ls -l的簡寫。至于 ; 則是同時發出兩個指令,
# 且讓兩個指令“按順序”執行的意思。上面的結果中可以看到,該檔案更改的日期
# Jul 4 11:45,但是atime與ctime不一樣。
範例三:修改案例二的bashrc檔案,将日期調整為兩天前。
[root@linux tmp]# touch -d "2 days ago" bashrc
[root@linux tmp]# ll bashrc; ll --time=atime bashrc; ll --time=ctime bashrc
-rwxr-xr-x 1 root root 395 Jul 17 21:02 bashrc
-rwxr-xr-x 1 root root 395 Jul 17 21:02 bashrc
-rwxr-xr-x 1 root root 395 Jul 19 21:02 bashrc
# 與上一個範例比較,本來是19日的變成了17日了(atime/mtime)。
# 不過,ctime并沒有跟着改變。
範例四:将上個範例的bashrc日期改為2005/07/15 2:02。
[root@linux tmp]# touch -t 0507150202 bashrc
[root@linux tmp]# ll bashrc; ll --time=atime bashrc; ll --time=ctime bashrc
-rwxr-xr-x 1 root root 395 Jul 15 02:02 bashrc
-rwxr-xr-x 1 root root 395 Jul 15 02:02 bashrc
-rwxr-xr-x 1 root root 395 Jul 19 21:05 bashrc
# 注意,日期在atime與mtime都改變了,但ctime則是記錄目前的時間。
通過touch指令,可以輕松地修改檔案的日期與時間。并且,也可以建立一個空檔案。不過,要注意的是,即使複制一個檔案,複制所有屬性,但也沒有辦法複 制ctime屬性。ctime可以記錄檔案最近改變狀态(status)的時間。無論如何,還是要說明一下,我們平時看的檔案屬性中,比較重要的還是 mtime。我們關心的常常是這個檔案的“内容”是什麼時候更改的。
touch這個指令最常用的情況是:
• 建立一個空檔案。
• 将某個檔案日期修改為目前日期(mtime與atime)。
與檔案相關的幾個時間:
1、通路時間,讀一次這個檔案的内容,這個時間就會更新。比如對這個檔案使用more指令。ls、stat指令都不會修改檔案的通路時間。
2、修改時間,對檔案内容修改一次,這個時間就會更新。比如:vi後儲存檔案。ls -l列出的時間就是這個時間。
3、狀态改變時間。通過chmod指令更改一次檔案屬性,這個時間就會更新。檢視檔案的詳細的狀态、準确的修改時間等,可以通過stat指令 檔案名。