天天看點

APUE-檔案和目錄(八)檔案時間

檔案的時間

與檔案相關的三個時間值:

  • 通路時間:最後一次通路檔案的時間。例如,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種方式之一進行指定。

  1. 如果times參數是空指針,兩個時間都修改為目前時間。
  2. 如果times參數指向兩個timespec結構的數組,任一數組元素的tv_nsec字段的值為UTIME_NOW,相應的時間戳就設定為目前時間,忽略相應的tv_sec字段。
  3. 如果times參數指向兩個timespec結構的數組,任一數組元素的tv_nsec字段的值為UTIME_OMIT,相應的時間戳保持不變,忽略相應的tv_sec字段。
  4. 如果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/

本文版權歸作者和部落格園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出,

原文連結

如果覺的部落客寫的可以,收到您的贊會是很大的動力,如果您覺的不好,您可以投反對票,但麻煩您留言寫下問題在哪裡,這樣才能共同進步。謝謝!