檔案的時間
與檔案相關的三個時間值:
- 通路時間:最後一次通路檔案的時間。例如,cat指令會修改這個時間。
- 修改時間:檔案内容最後一次被修改的時間。
- 狀态更改時間:檔案的i節點最後一次被修改的時間。例如,更改檔案的通路權限、更改使用者ID、更改連結數都會修改i節點。
注意:系統并不維護對一個i節點的最後一次通路時間,是以access和stat函數并不更改這3個時間中的任一個。
使用ls指令可以檢視這些時間:
- 顯示檔案修改時間
ls -l
- 顯示檔案通路時間
ls -lu
- 顯示檔案狀态更改時間
ls -lc
見下面的例子:
harlan@ubuntu:~$ stat .viminfo
File: '.viminfo'
Size: 3253 Blocks: 8 IO Block: 4096 regular file
Device: 801h/2049d Inode: 1711895 Links: 1
Access: (0700/-rwx------) Uid: ( 1000/ harlan) Gid: ( 1000/ harlan)
Access: 2017-06-12 06:53:58.258545348 -0700
Modify: 2017-01-05 04:06:31.333572308 -0800
Change: 2017-06-12 06:55:12.990027381 -0700
Birth: -
harlan@ubuntu:~$ ls -lu .viminfo
-rwx------ 1 harlan harlan 3253 Jun 12 06:53 .viminfo
harlan@ubuntu:~$ ls -l .viminfo
-rwx------ 1 harlan harlan 3253 Jan 5 04:06 .viminfo
harlan@ubuntu:~$ ls -lc .viminfo
-rwx------ 1 harlan harlan 3253 Jun 12 06:55 .viminfo
如果再加一個參數-t,就會按照相應的時間降序排列顯示:
harlan@ubuntu:~$ ls -lt
total 61856
-rw-rw-rw- 1 harlan harlan 4050 Jun 12 07:16 null
drwxr-xr-x 2 harlan harlan 4096 Jan 2 05:02 Downloads
drwxr-xr-x 2 harlan harlan 4096 Dec 24 20:43 Desktop
drwxr-xr-x 2 harlan harlan 4096 Nov 28 2016 Documents
drwxr-xr-x 2 harlan harlan 4096 Nov 28 2016 Music
drwxr-xr-x 2 harlan harlan 4096 Nov 28 2016 Pictures
drwxr-xr-x 2 harlan harlan 4096 Nov 28 2016 Public
drwxr-xr-x 2 harlan harlan 4096 Nov 28 2016 Templates
drwxr-xr-x 2 harlan harlan 4096 Nov 28 2016 Videos
-rw-r--r-- 1 harlan harlan 8980 Nov 28 2016 examples.desktop
-rw-r--r-- 1 root root 63289725 Dec 10 2014 go1.4.linux-amd64.tar.gz
harlan@ubuntu:~$ ls -lut
total 61856
-rw-rw-rw- 1 harlan harlan 4050 Jun 12 07:21 null
drwxr-xr-x 2 harlan harlan 4096 Jun 12 06:53 Downloads
drwxr-xr-x 2 harlan harlan 4096 Jan 16 05:04 Pictures
drwxr-xr-x 2 harlan harlan 4096 Jan 16 05:04 Public
drwxr-xr-x 2 harlan harlan 4096 Jan 16 05:04 Templates
drwxr-xr-x 2 harlan harlan 4096 Jan 16 05:04 Videos
drwxr-xr-x 2 harlan harlan 4096 Jan 16 05:04 Documents
drwxr-xr-x 2 harlan harlan 4096 Jan 16 05:04 Music
drwxr-xr-x 2 harlan harlan 4096 Jan 16 05:04 Desktop
-rw-r--r-- 1 root root 63289725 Jan 14 17:24 go1.4.linux-amd64.tar.gz
-rw-r--r-- 1 harlan harlan 8980 Jan 14 01:33 examples.desktop
harlan@ubuntu:~$ ls -lct
total 61856
-rw-rw-rw- 1 harlan harlan 4050 Jun 12 07:22 null
drwxr-xr-x 2 harlan harlan 4096 Jan 2 05:02 Downloads
drwxr-xr-x 2 harlan harlan 4096 Dec 24 20:43 Desktop
-rw-r--r-- 1 root root 63289725 Dec 24 20:34 go1.4.linux-amd64.tar.gz
drwxr-xr-x 2 harlan harlan 4096 Nov 28 2016 Documents
drwxr-xr-x 2 harlan harlan 4096 Nov 28 2016 Music
drwxr-xr-x 2 harlan harlan 4096 Nov 28 2016 Pictures
drwxr-xr-x 2 harlan harlan 4096 Nov 28 2016 Public
drwxr-xr-x 2 harlan harlan 4096 Nov 28 2016 Templates
drwxr-xr-x 2 harlan harlan 4096 Nov 28 2016 Videos
-rw-r--r-- 1 harlan harlan 8980 Nov 28 2016 examples.desktop
如何清理一周内沒有被通路過的core?
使用find指令,下面介紹幾個關鍵參數
-name pattern 過濾出比對shell模式pattern的檔案名。
-atime n 關于參數n:
- +n表示 (n+1)*24小時之前通路的檔案
- n表示 (n+1)*24和n*24小時之間通路的檔案
- -n表示 n*24小時以内通路的檔案。
看下面的圖,2017-06-20 08:41:30為目前時間,
- atime -1表示通路時間為1天以内的
- atime - 表示2天之前和1天之前之間的時間通路的檔案
- atime +1表示2天之前的。
是以一周内沒有被通路過的檔案則是
atime +6
-exec command ;
執行command;所有接下來的find的參數都會傳遞給command,直到碰見包含;的參數。字元串"{}"被找到的檔案名替換。
最終的結果如下:
find /檔案路徑 -name "core" -atime +6 -exec rm {} \;
- {}表示的是由下面的指令找到的内容,find的結果被放到{}中
find /檔案路徑 -name "core" -atime +6
- -exec一直到;關鍵字,代表find額外動作的開始(-exec)到結束(;),中間的就是額外動作。這裡為rm,因為分号;在bash中是有特殊意義的,是以用反斜線來轉義。
參考
鳥哥私房菜-find另外,
find指令中的-mtime和-ctime分别代表内容修改時間和狀态更改時間,用來歸檔内容被修改或者i節點被更改的檔案。
圖4-20列出了我們已經說明的各種函數對這3個時間的作用。目錄是包含目錄項(檔案名和相關的i節點編号)的檔案,增加、删除或修改目錄項會影響它所在目錄相關的三個時間。是以圖4-20包含兩列,其中一列是與該檔案(或目錄)相關的3個時間,另一列是所引用的檔案(或目錄)的父目錄相關的3個時間。
函數futimens、utimensat和utimes
#include <sys/stat.h>
int futimens(int fd,const struct timespec times[2]);
int utimensat(int fd,const char* path,const struct timespec times[2],int flag);
兩個函數傳回值:成功傳回0;失敗傳回-1
- times[0]代表檔案通路時間;
- times[1]代表檔案内容修改時間。
時間戳按照下列4種方式之一進行指定。
- 如果times參數是空指針,兩個時間都修改為目前時間。
- 如果times參數指向兩個timespec結構的數組,任一數組元素的tv_nsec字段的值為UTIME_NOW,相應的時間戳就設定為目前時間,忽略相應的tv_sec字段。
- 如果times參數指向兩個timespec結構的數組,任一數組元素的tv_nsec字段的值為UTIME_OMIT,相應的時間戳保持不變,忽略相應的tv_sec字段。
- 如果times參數指向兩個timespec結構的數組,且tv_nsec字段的值都不上面兩種值,在這種情況下,相應的時間戳設定為相應的tv_sec和tv_nsec字段的值。
執行這些函數所要求的優先權取決于times參數的值。
- 如果times是一個空指針,或者任一tv_nsec字段設定為UTIME_NOW,則程序的有效使用者ID必須等于該檔案的所有者ID,程序對該檔案必須具有寫權限,或者程序是超級使用者程序。
- 如果times是非空指針,并且任一tv_nsec字段的值既不是UTIME_NOW也不是UTIME_OMIT,則程序的有效使用者ID必須等于該檔案的所有者ID,或者程序必須是一個超級使用者程序。對檔案隻有寫權限是不夠的。
- 如果times是非指針,并且兩個tv_nsec字段的值都為UTIME_OMIT,就不執行任何的權限檢查。
utimensat的flag參數可用于進一步修改預設行為。如果設定了AT_SYMLINK_NOFOLLOW标志,則符号連結本身的時間會被修改(如果路徑名指向符号連結)。預設行為是跟随符号連結,并把檔案的時間修改為符号連結的時間。
utimes函數包含在Single UNIX Specification的XSI擴充選項中。
#include <sys/time.h>
int utimes(const char* pathname,const struct timeval times[2]);
函數傳回值:成功傳回0,失敗傳回-1。
times參數指向包含兩個時間戳元素的數組的指針,兩個時間戳用秒和微妙表示。
struct timeval{
time_t tv_sec;/\*seconds\*/
long tv_usec;/\*microseconds\*/
}
注意,我們不能對狀态更改時間st_ctim(i節點最近被修改的時間)指定一個值,因為調用utimes函數時,此字段被自動更新。
作者:
HarlanC部落格位址:
http://www.cnblogs.com/harlanc/個人部落格:
http://www.harlancn.me/本文版權歸作者和部落格園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出,
原文連結如果覺的部落客寫的可以,收到您的贊會是很大的動力,如果您覺的不好,您可以投反對票,但麻煩您留言寫下問題在哪裡,這樣才能共同進步。謝謝!