[英]Get file creation time with Python on linux
os.stat 返回 st_mtime 和 st_ctime 属性,修改时间在 POSIX 上为 st_mtime 和 st_ctime “更改时间”。 是否有任何函数可以使用 python 和在 Linux 下返回文件的创建时间?
3.1) How do I find the creation time of a file? You can't - it isn't stored anywhere. Files have a last-modified time (shown by "ls -l"), a last-accessed time (shown by "ls -lu") and an inode change time (shown by "ls -lc"). The latter is often referred to as the "creation time" - even in some man pages - but that's wrong; it's also set by such operations as mv, ln, chmod, chown and chgrp. The man page for "stat(2)" discusses this.
尝试:
st_birthtime
但不能保证在所有系统上都可用。 从文档:
在某些 Unix 系统(例如 Linux)上,以下属性也可用:st_blocks(为文件分配的块数)、st_blksize(文件系统块大小)、st_rdev(设备类型,如果是 inode 设备)。 st_flags(用户定义的文件标志)。
在其他 Unix 系统(例如 FreeBSD)上,以下属性可能可用(但只有在 root 尝试使用它们时才可能填写):st_gen(文件生成编号)、st_birthtime(文件创建时间)。
由于缺乏好的实用程序,我创建了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
调用。
在 python 中(不要忘记你仍然需要在 linux 上用 sudo 调用它):
from crtime import get_crtimes, get_crtimes_in_dir
get_crtimes_in_dir("./")
根据这里的一个线程, OS X 的 HFS 和 Microsoft 的 NTFS 也都跟踪出生时间,我被告知 OS X 和 Cygwin 版本的 stat() 返回此信息。 至少对于 mac,查看osx stat 联机帮助页似乎是正确的:
甲、米、丙、乙
上次访问或修改文件的时间、上次更改 inode 的时间或inode的出生时间。
对于像EXT4 Linux的文件系统更新,增加了Btrfs和JFS不支持这种使用debugfs ,有取自一个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
运行debugfs
并解析输出。
某些文件系统确实支持记录出生时间,但 Linux 不提供获取它的接口。
见http://lwn.net/Articles/397442/
如果尝试使用“stat”命令来获取它: % stat -c %w {file or dir}
结果将是“-”,因为它无法检索它。 但是,可以使用此示例方法利用 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
}
请注意,这需要 sudo。
你是什么意思它不能完成[1]? 功能,
os.stat(path).st_birthtime,效果很好。
\n [1]:\n有人说做不到\n 但他笑着回答\n那个“也许不能”,但他会是一个\n 在他尝试之前,谁不会这么说。\n所以他带着一丝笑容直接扣了进去\n 在他的脸上。 如果他担心,他就会隐藏起来。\n当他处理这件事时,他开始唱歌\n 那是不可能的,而他做到了!\n ——埃德加·阿尔伯特·客人\n
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.