2009-09-10 113 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