os.stat返回st_mtime和st_ctime属性,修改时间是st_mtime和st_ctime“更改时间”在POSIX上。 是否有任何函数使用python并在Linux下返回文件的创建时间?
答案 0 :(得分:25)
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 (文件创建时间)。
答案 2 :(得分:1)
您可以解释为什么要这样做。
间接解决方案可能是使用一些revision control系统(a.k.a.版本控制系统= VCS)来管理需要生成时间的文件。
所以你可以对这些文件使用git(即将它们作为“源代码”处理)。然后你不仅知道它们何时被创建(实际上是使用git add
在VCS中注册的),而是为什么,由谁,为什么等...使用git log
来获取所有这些...
当然,您需要教育您的用户使用像git
答案 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