2009-09-10 47 views
19

os.stat返回st_mtime和st_ctime屬性,修改時間爲POSIX上的st_mtime和st_ctime「更改時間」。 是否有任何函數返回使用Python和Linux下的文件的創建時間?在Linux上使用Python獲取文件創建時間

+0

這爲我工作:http://stackoverflow.com/a/947239/4535020 – Tbb 2015-07-01 14:29:14

+1

看起來這取決於你用什麼文件系統:http://unix.stackexchange.com/questions/7562/what -file-systems-on-linux-store-the-creation-time – CSJ 2015-07-03 06:41:17

回答

25

You probablycan't.

3.1)我如何找到一個文件的創建時間?

你不能 - 它不存儲在任何地方。文件具有最後修改的 時間(由「ls -l」示出),最後訪問時間(由「ls -lu」示出)以及inode更改時間(由「ls -lc」示出)。後者通常是 被稱爲「創建時間」 - 即使在某些手冊頁中 - 但這是錯誤的;它也由諸如mv,ln, chmod,chown和chgrp等操作設置。

「stat(2)」的手冊頁討論了這一點。

+0

那麼有沒有一個命令來查找在Linux中創建文件的時間和日期如果stat不是? – 2009-09-10 23:55:20

+5

通常,UNIX文件系統根本不存儲創建時間 - 沒有辦法檢索從未寫入磁盤的數據。 – ephemient 2009-09-11 02:16:32

13

嘗試:

st_birthtime 

它不是」保證是適用於所有系統雖然。從文檔:

在一些Unix系統(如Linux), 以下屬性也可能是 可供選擇:的st_blocks(編號分配給文件塊 的),st_blksize (文件系統塊大小),st_rdev(如果是inode設備,則輸入設備的 )。 st_flags(用戶爲 文件定義的標誌)。

在其他Unix系統(如 FreeBSD的),以下屬性可以 是可用的(但也可以僅填充 出如果根嘗試使用它們):st_gen (文件生成號),st_birthtime (時間的文件創建)。

​​

1

您或許可以解釋爲什麼要這麼做。

間接的解決方案可能是使用一些revision control系統(又名版本控制系統= VCS)來管理需要出生時間的文件。

因此,您可以在這些文件上使用git(即將它們作爲「源代碼」處理)。那麼你不僅知道它們何時被創建(實際上在VCS中使用git add註冊),而是爲什麼,由誰,爲什麼等...使用git log獲取所有這些......

當然,你不知何故需要教育用戶使用VCS像git

1

根據線程hereOS X的HFS和微軟的NTFS還兼具跟蹤的誕生時間,而且我告訴OS X和統計的Cygwin的版本()返回此信息。其看osx stat manpage似乎是正確的至少爲Mac:

一個,M,C,B

的時間文件的最後訪問或修改時,索引節點最後更改的,或inode的出生時間爲

對於像EXT4,增加了Btrfs和JFS Linux的新文件系統都支持這一點使用debugfs,有來自here採取一個bash的功能,將提取的日期創建的時間戳:

您可以恢復該文件創建日期,如果你處理能力的文件系統EXT4一樣 - 日誌文件系統爲Linux:

改進時間戳

...的ext4提供了測量的時間戳納秒。另外,ext4還增加了對日期創建時間戳的支持。 但是在社區中沒有共識,因此

...正如Theodore Ts'o所指出的那樣,雖然在inode中添加額外的創建日期字段是很容易的(因此技術上支持日期創建ext4中的時間戳),修改或添加必要的系統調用(如stat()(可能需要新版本)以及依賴它們的各種庫(如glibc)更加困難。這些變化需要協調許多項目。因此,即使ext4開發人員實現對創建日期時間戳的初始支持,此功能目前也不會提供給用戶程序。 以Linus最終報價結束

讓我們等待五年,看看是否真的需要和使用共識,而不是因爲「我們可以」而匆忙進入某種東西。

xstat() { 
    for target in "${@}"; do 
    inode=$(ls -di "${target}" | cut -d ' ' -f 1) 
    fs=$(df "${target}" | tail -1 | awk '{print $1}') 
    crtime=$(sudo debugfs -R 'stat <'"${inode}"'>' "${fs}" 2>/dev/null | 
    grep -oP 'crtime.*--\s*\K.*') 
    printf "%s\t%s\n" "${crtime}" "${target}" 
    done 
} 

運行它返回的創建日期:

:~$ echo 'print("hello world")' > blah.py 
:~$ xstat "blah.py" 
Mon Jul 6 13:43:39 2015 blah.py 
:~$ echo 'print("goodbye world")' > blah.py 
:~$ xstat "blah.py" 
Mon Jul 6 13:43:39 2015 blah.py 

所以,除非文件系統支持的話那麼它是不可能的,如果該文件系統,那麼你可以使用子進程運行debugfs和解析輸出。

0

某些文件系統支持記錄出生時間,但Linux不提供獲取它的界面。

參見http://lwn.net/Articles/397442/

如果一個atempts使用 「STAT」 命令以得到它: %STAT -c%重量{文件或目錄}

其結果將是一個 「 - 」 由於它沒有能力檢索它。然而,可以使用利用與debugfs此xstat樣品的方法來檢索它(再次提供,正在使用的文件系統支持收集它。)

https://gist.github.com/moiseevigor/8c496f632137605b322e

xstat() { 
    for target in "${@}"; do 
    inode=$(ls -di "${target}" | cut -d ' ' -f 1) 
    fs=$(df "${target}" | tail -1 | awk '{print $1}') 
    crtime=$(sudo debugfs -R 'stat <'"${inode}"'>' "${fs}" 2>/dev/null | 
    grep -oP 'crtime.*--\s*\K.*') 
    printf "%s\t%s\n" "${crtime}" "${target}" 
    done 
} 

注意這需要須藤。

0

你是什麼意思,它不能做[1]?功能

os.stat(path).st_birthtime
,效果很好。

 
[1]: 
Somebody said that it couldn’t be done 
     But he with a chuckle replied 
That 「maybe it couldn’t,」 but he would be one 
     Who wouldn’t say so till he’d tried. 
So he buckled right in with the trace of a grin 
     On his face. If he worried he hid it. 
He started to sing as he tackled the thing 
     That couldn’t be done, and he did it! 
-- Edgar Albert Guest 
+0

那是什麼?你的答案很混亂。 – Billa 2018-02-25 03:32:01