1. 程式人生 > >linux下檔案時間戳修改

linux下檔案時間戳修改

1.touch命令
linux的touch命令不常用,一般在使用make的時候可能會用到,用來修改檔案時間戳,或者新建一個不存在的檔案。
命令格式:
touch [選項]… 檔案…
命令引數:
-a 或–time=atime或–time=access或–time=use  只更改存取時間。
-c 或–no-create  不建立任何文件。
-d  使用指定的日期時間,而非現在的時間。
-f  此引數將忽略不予處理,僅負責解決BSD版本touch指令的相容性問題。
-m 或–time=mtime或–time=modify  只更改變動時間。
-r  把指定文件或目錄的日期時間,統統設成和參考文件或目錄的日期時間相同。
-t  使用指定的日期時間,而非現在的時間。

2.
一個檔案的訪問和修改時間可以用以下幾個函式更改。futimens和utimensat函式可以指定納秒級精度的時間戳。用到的資料結構是與stat函式族相同的timespec結構(見4.2節)。

#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陣列引數的第一個元素包含訪問時間,第二元素包含修改時間。這兩個時間值是日曆時間,如1.10節所述,這是自特定時間(1970年1月1日00:00:00)以來所經過的秒數。不足秒的部分用納秒錶示。

時間戳可以按下列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欄位的值為既不是UTIME_NOW也不是UTIME_OMIT,在這種情況下,相應的時間戳設定為相應的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,就不執行任何的許可權檢查。

futimens函式需要開啟檔案來更改它的時間,utimensat函式提供了一種使用檔名更改檔案時間的方法。pathname引數是相對於fd引數進行計算的,fd要麼是開啟目錄的檔案描述符,要麼設定為特殊值AT_FDCWD(強制通過相對於呼叫程序的當前目錄計算pathname)。如果pathname指定了絕對路徑,那麼fd引數被忽略。

utimensat的flag引數可用於進一步修改預設行為。如果設定了AT_SYMLINK_NOFOLLOW標誌,則符號連結本身的時間就會被修改(如果路徑名指向符號連結)。預設的行為是跟隨符號連結,並把檔案的時間改成符號連結的時間。

futimens和utimensat函式都包含在POSIX.1中,第3個函式utimes包含在Single UNIX Specification的XSI擴充套件選項中。

#include <sys/time.h>     

int utimes(const char *pathname, const struct timeval times[2]);     

函式返回值:若成功,返回0;若出錯,返回-1
utimes函式對路徑名進行操作。times引數是指向包含兩個時間戳(訪問時間和修改時間)元素的陣列的指標,兩個時間戳是用秒和微妙表示的。


struct timeval {    
        time_t tv_sec; /* seconds */    
        long tv_usec;  /* microseconds */  
}; 

注意,我們不能對狀態更改時間st_ctim(i節點最近被修改的時間)指定一個值,因為呼叫utimes函式時,此欄位會被自動更新。

在某些UNIX版本中,touch(1)命令使用這些函式中的某一個。另外,標準歸檔程式tar(1)和cpio(1)可選地呼叫這些函式,以便將一個檔案的時間值設定為將它歸檔時儲存的時間。

程式使用帶O_TRUNC選項的open函式將檔案長度截斷為0,但並不更改其訪問時間及修改時間。為了做到這一點,首先用stat函式得到這些時間,然後截斷檔案,最後再用futimens函式重置這兩個時間。這裡寫圖片描述
可以用以下Linux命令演示圖4-21中的程式:


$ ls -l changemod times           檢視長度和最後修改時間    
-rwxr-xr-x 1 sar 13792 Jan 22 01:26 changemod    
-rwxr-xr-x 1 sar 13824 Jan 22 01:26 times    
$ ls -lu changemod times          檢視最後訪問時間    
-rwxr-xr-x 1 sar 13792 Jan 22 22:22 changemod    
-rwxr-xr-x 1 sar 13824 Jan 22 22:22 times    
 $ date                               列印當天日期    
 Fri Jan 27 20:53:46 EST 2012    
 $ ./a.out changemod times        執行圖4-21的程式    
 $ ls -l changemod times          檢查結果    
-rwxr-xr-x 1 sar           0 Jan 22 01:26 changemod    
-rwxr-xr-x 1 sar           0 Jan 22 01:26 times    
 $ ls -lu changemod times          檢查最後訪問時間    
-rwxr-xr-x 1 sar           0 Jan 22 22:22 changemod    
-rwxr-xr-x 1 sar           0 Jan 22 22:22 times    
 $ ls -lc changemod times          檢查狀態更改時間    
-rwxr-xr-x 1 sar           0 Jan 27 20:53 changemod    
-rwxr-xr-x 1 sar           0 Jan 27 20:53 times 

正如我們所預見的一樣,最後修改時間和最後訪問時間未變。但是,狀態更改時間則更改為程式執行時的時間。

相關推薦

linux檔案時間修改

1.touch命令 linux的touch命令不常用,一般在使用make的時候可能會用到,用來修改檔案時間戳,或者新建一個不存在的檔案。 命令格式: touch [選項]… 檔案… 命令引數: -a 或–time=atime或–time=acces

C語言:Linux獲取時間

在Unix/Linux系統下,使用gettimeofday函式來獲得當前系統的時間戳,精度可達到微秒(microsecond,即μs)級別。 #include <stdio.h> #include <sys/time.h> int main(void) {

linux檔案的建立時間、訪問時間修改時間和改變時間

   Linux系統中沒有命令可以確切的檢視一個檔案的生成時間,但是可以知道訪問時間,修改時間,改變時間。 可以通過stat命令檢視一個檔案的訪問時間,修改時間,改變時間: 以下為三個時間的區別: 1、訪問時間(accesstime):讀取一次檔案的內容,該時間

Linux使用touch批量修改資料夾和檔案時間

下面只有兩個引數存在差別,d與f,d表示資料夾,f表示檔案。 查詢當前目錄下,所有的資料夾以及子資料夾,並把所有的資料夾及子資料夾設定成755,包括當前目錄 find ./ -type d -exe

linux時間修改

linux下的時間修改linux系統有兩個時間,一個是系統時間,另一個是cmos時間。需要把兩個時間都調對!方法一:修改系統時間(1).用root登錄,用date命令調好系統時間date -s "2017/11/10 10:20:00" 把系統時間改為17年11月10號10點20分這個修改在系統重啟後就失效了

Linux時間ping網路加時間並記錄到文字

由於一些原因,比如需要檢查網路之間是否存在掉包等問題,會長時間去ping一個地址,由於會輸出大量的資訊而且最好要有時間戳,因此我們可以使用簡單的幾個shell命令組合就可以實現:長時間ping一個地址,記錄每次ping的時間戳,並輸出到文字儲存,另外我們還可以將這個動作放到

linux用命令批量修改替換檔案內容

在linux入侵之後,我們要清除留下的一些痕跡,比如apache留下的日誌.但是對於ssh登陸日誌比如/var/log/wtmp 和 lastlog這類二進位制檔案,sed命令就愛莫能助了. Linux下批量替換多個檔案中的字串的簡單方法。用sed命令可以批量替換多個檔案

linux檔案的三個時間(Atime ,Mtime,Ctime)

在windows系統中建立檔案會儲存檔案有關的三個時間,分別是建立時間,修改時間,訪問時間。 在linux中式怎樣的呢? 我們在linux中新建一個檔案,用stat命令檢視檔案資訊: 系統儲存了這三個時間,分別是Access time(訪問時間),Modify time

linux 檔案的3種時間狀態 atime ctime mtime

我們在windows下新建一個檔案,我們知道它在儲存的時候肯定是會儲存一下檔案的建立時間之類的資訊的。 看它的屬性是可以看到儲存了這個檔案的建立時間、修改時間、和訪問時間三個時間。 那麼在lin

Linuxntp時間同步

span ntpd usr pan style root用戶 linu date命令 軟件 在root用戶下執行 先安裝同步時間軟件,每臺機器執行 yum install -y ntp 然後執行以下命令: crontab -e */10 * * * * /usr/sbin/

windows時間創建文件名

str sym start ebs mbo tracker tail class mysql\ 英文環境下: echo Archive_%date:~-4,4%%date:~-10,2%%date:~-7,2%_%time:~0,2%%time:~3,2%%time:~

linux 添加,修改,刪除路由

pts 開始 轉發 網絡 scrip 防火墻 scripts ble iptables 在日常生活中,或者在服務器中,有多個網卡配置多個地址,訪問不同的網絡段,這種情況是非常常見的現象,這個時候我們就需要添加多個路由來實現多網絡段的通行。 一、設置當前終端路由(再開機就沒效

linux安裝mysql並修改密碼 [轉]

刪除已有mysql並重新安裝mysql 檢視是否已安裝過mysql rpm -qa |grep -i mysql     2.移除安裝的包 (在之前如果有啟動mysql最好關掉服務) 使用rpm –ev 包名   3.

linux時間同步和時間管理

一、chronyd 服務 該服務是時間同步服務,類似與windows中的自動與網路時間同步的功能,在linux中這個時間同步是確定客戶主機使用的時間同步服務的,在chronyd.service 服務中載入時間源地址,配置檔案在/etc/chrony.conf 1.首先需要傳送方編輯配置檔案,第 第2

Linux檔案解壓縮、軟體安裝

1、linux常用解壓縮命令:.zip格式  解壓:unzip  檔名.zip   壓縮:zip  檔名.zip  目錄名 .tar格式  壓縮:tar  cvf  檔名.tar  檔名

linux檔案的大小到底多大

檔案的大小和實際佔用的空間,是倆回事兒,一般情況下,檔案大小 < 其佔用空間的大小, 即 ls -al file_name 小於 du -sk file_name 的大小 ,原因是:佔用空間取決於檔案系統的塊(block)的大小,linux一般預設是4k(4096) ,因此,一個大小為1個位元組的檔案,

linux檔案比較工具diff|cmp使用小結

轉自:http://blog.csdn.net/wangjianno2/article/details/50451737,記錄下便於忘記時查詢。 1.diff diff是Unix系統的一個很重要的工具程式。它用來比較兩個文字檔案的差異,是程式碼版本管理的基石之一。 2.diff使用

linux 檔案同步函式(fflush、sync、fsync、fdatasync)之間差異

遇到機器異常關機時,寫log檔案資訊丟失問題,所以記錄下。   Linux實現中在核心設有緩衝區快取記憶體或頁面快取記憶體,大多數磁碟I/O都通過緩衝區進行。當我們向檔案寫資料時,核心通常先將資料複製到一個緩衝區中,如果該緩衝區尚未寫滿,則並不將其排入輸出佇列,而是等待寫滿或者核心需要重用該

linux 單調時間(另附牆上時間、CPU時間

1、單調時間     linux下編寫應用程式時,涉及到時間獲取有多個函式可以選擇,這些常用獲取時間函式之間的差異: 《1》、 time 該函式返回自1970來的秒數,精度過低; 《2》、gettimeofday   該函式返回自1970年以來的秒數和微秒數,精度足夠,符合一般場景的使用

Linux檔案編碼格式轉換

常常在Linux中操作Windows下的檔案時,會遇到亂碼的情形。常見的比如在Visual Studio 中寫的C\C++程式需要放到Linux主機上編譯,而程式的中文註釋則顯示為亂碼,比較嚴重的是由於編碼原因,Linux上的編譯器報錯。 這是由於Windows中預設的檔案格式是GBK(gb2312),而L