我們在介紹ls這個命令時,提到每個文件在Linux下面都會記錄許多的時間參數,其實是有三個主要的變動時間,那么三個時間的意義是什么?
- 修改時間(modification time,mtime):當該文件的【內容數據】變更時,就會更新這個時間,內容數據指的是文件的內容,而不是文件的屬性或權限。
- 狀態時間(status time,ctime ):當該文件的【狀態(status)】改變時,就會更新這個時間,舉例來說,像是權限與屬性被更改了,都會更新這個時間。
- 讀取時間(access time,atime):當【該文件的內容被讀取】時,就會更新這個讀取時間(access),
舉例來說,我們使用cat去讀取/etc/man_db.conf,就會更新該文件的atime。
這是個挺有趣的現象,舉例來說,我們來看一看你自己的/etc/man_db.conf這個文件的時間吧
看到了嗎?
在默認的情況下,Is顯示出來的是該文件的mtime,也就是這個文件的內容上次被修改的時間。
????????至于我的系統是在2023年6月30號的時候安裝,因此,這個文件被產生導致狀態被修改的時間就回溯到那個時間點了(ctime)。而還記得剛剛我們使用的范例當中,有使用到man_db.conf這個文件,所以,它的atime 就會變成剛剛使用的時間了。
????????文件的時間是很重要的,因為,如果文件的時間錯誤的話,可能會造成某些程序無法順利的運行。那么萬一我發現了一個文件來自未來,該如何讓該文件的時間變成【現在】的時刻呢?很簡單,就用【touch】這個命令即可。
????????不要懷疑系統時間會“來自未來”,很多時候會有這個問題。
????????舉例來說,在安裝過后系統時間可能會被改變,因為中國時區在國際標準時間“格林威治時間,GMT”的右邊,所以會比較早看到陽光,也就是說中國時間比GMT時間快了8小時。如果安裝不當,我們的系統可能會快8小時,你的文件就有可能來自8小時后了。
至于某些情況下,由于BIOS的設置錯誤,導致系統時間跑到未來時間,并且你又建立了某些文件,等你將時間改回正確的時間時,該文件不就變成來自未來了嗎?
- touch [-acdmt]文件
選項與參數:
- -a:僅自定義 access time;
- -c:僅修改文件的時間,若該文件不存在則不建立新文件;
- -d:后面可以接欲自定義的日期而不用目前的日期,也可以使用--date="日期或時間";
- -m:僅修改mtime;
- -t:后面可以接欲自定義的時間而不用目前的時間,格式為[YYYYMMDDhhmm];
范例一:新建一個空文件并觀察時間。
注意到,這個文件的大小是0.
在默認的狀態下,如果touch后面有接文件,則該文件的三個時間(atime/ctime/mtime)都會更新為目前的時間。
若該文件不存在,則會主動的建立一個新的空文件,例如上面這個例子。
范例二:將~/.bashrc復制成為bashrc,假設復制完全的屬性,檢查其日期。
從上往下依次是目前的時間,mtime,atime,ctime.
????????執行的結果當中,我們可以發現數據的內容與屬性是被復制過來的,因此文件修改時間(mtime)與原本文件相同。但是由于這個文件是剛剛被建立的,因此狀態時間(ctime)就變成現在的時間。
那如果你想要變更這個文件的時間?可以這樣做:
范例三:修改案例二的bashrc文件,將日期調整為兩天前。
#跟上個范例比較看看,本來是 ?8日變成了6日(atume/mtime)。
不過,ctime 并沒有跟著改變。
范例四:將上個范例的bashrc日期改為2014/06/152:02。
注意看看,日期在atime與mtime都改變了,但是ctime則是記錄目前的時間
????????通過touch這個命令,我們可以輕易地自定義文件的日期與時間,并且也可以建立一個空文件。
不過要注意的是,即使我們復制一個文件時,復制所有的屬性,但也沒有辦法復制ctime 這個屬性。ctime以記錄這個文件最近的狀態(status)被改變的時間。
無論如何,還是要告知大家,我們平時看的文件屬性中,比較重要的還是mtime。我們關心的常常是這個文件的內容是什么時候被修改,了解了嗎?
無論如何,touch這個命令最常被使用的情況是:
- 建立一個空文件;
- 將某個文件日期自定義為目前(mtime與atime)。