在Linux上使用Python获取文件创建时间

时间:2009-09-10 23:35:40

标签: python linux

os.stat返回st_mtime和st_ctime属性,修改时间是st_mtime和st_ctime“更改时间”在POSIX上。 是否有任何函数使用python并在Linux下返回文件的创建时间?

7 个答案:

答案 0 :(得分:25)

You probably can't.

  

3.1)如何找到文件的创建时间?

     

你不能 - 它不存储在任何地方。文件有最后修改过的     时间(以“ls -l”表示),最后访问时间(以“ls -lu”表示)     和inode更改时间(由“ls -lc”表示)。后者经常是     被称为“创作时间” - 即使在某些手册页中 -     但这是错的;它也是由mv,ln这样的操作设定的,     chmod,chown和chgrp。

     

“stat(2)”的手册页讨论了这一点。

答案 1 :(得分:13)

尝试:

st_birthtime

但并不保证可以在所有系统上使用。来自文档:

  

在某些Unix系统(例如Linux)上,   以下属性也可能是   available:st_blocks(块数   分配给文件),st_blksize   (filesystem blocksize),st_rdev(type   设备如果是inode设备)。   st_flags(用户定义的标志   文件)。

     

在其他Unix系统上(例如   FreeBSD),可能有以下属性   可用(但可能只是填写   out如果root尝试使用它们):st_gen   (文件生成号),st_birthtime   (文件创建时间)。

http://docs.python.org/2/library/os.html#os.stat

答案 2 :(得分:1)

您可以解释为什么要这样做。

间接解决方案可能是使用一些revision control系统(a.k.a.版本控制系统= VCS)来管理需要生成时间的文件。

所以你可以对这些文件使用git(即将它们作为“源代码”处理)。然后你不仅知道它们何时被创建(实际上是使用git add在VCS中注册的),而是为什么,由谁,为什么等...使用git log来获取所有这些...

当然,您需要教育您的用户使用像git

这样的VCS

答案 3 :(得分:1)

根据线程here OS X的HFS和微软的NTFS也跟踪出生时间,我告诉OS X和Cygwin的版本stat()返回此信息。查看osx stat manpage似乎至少对于mac来说是正确的:

a,m,c,B

  

上次访问或修改时间文件,上次更改inode的时间,或者                         inode的出生时间

对于linux这样的较新的文件系统,Btrfs和JFS确实使用debugfs支持这一点,有一个从here获取的bash函数将提取日期创建的时间戳:

  

如果您处理EXT4等功能强大的文件系统 - Linux的日记文件系统,您可以恢复文件创建日期:

     

改进了时间戳

     

... Ext4提供以纳秒为单位的时间戳。此外,ext4还增加了对日期创建的时间戳的支持。   但是社区没有达成共识

     

...正如Theodore Ts指出的那样,虽然很容易在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并解析输出。

答案 4 :(得分:1)

由于缺乏好的实用程序,我创建了crtime

pip install crtime

然后您可以像使用它一样

sudo crtime ./

会打印:

1552938281  /home/pascal/crtime/.gitignore
1552938281  /home/pascal/crtime/README.md
1552938281  /home/pascal/crtime/crtime
1552938281  /home/pascal/crtime/deploy.py
1552938281  /home/pascal/crtime/setup.cfg
1552938281  /home/pascal/crtime/setup.py
1552938961  /home/pascal/crtime/crtime.egg-info
1552939447  /home/pascal/crtime/.git
1552939540  /home/pascal/crtime/build
1552939540  /home/pascal/crtime/dist

请注意,对于大型目录,它会比上面的xstat快1000倍,因为这会创建一个临时文件,然后立即对所有文件执行stat调用。

答案 5 :(得分:0)

某些文件系统确实支持记录出生时间,但Linux不提供获取它的接口。

请参阅http://lwn.net/Articles/397442/

如果有人尝试使用“stat”命令来获取它: %stat -c%w {file or dir}

结果将是“ - ”,因为它无法检索它。但是,可以使用此示例方法利用带有xstat的debugfs来检索它(再次提供,正在使用的文件系统支持收集它。)

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
}

注意这需要sudo。

答案 6 :(得分:-1)

你的意思是什么意思无法完成[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