Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/28.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在linux上使用Python获取文件创建时间_Python_Linux - Fatal编程技术网

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

在linux上使用Python获取文件创建时间,python,linux,Python,Linux,stat返回st_mtime和st_ctime属性,修改时间是POSIX上的st_mtime和st_ctime“更改时间”。 是否有任何函数可以使用python和Linux返回文件的创建时间?: 3.1)如何查找文件的创建时间? 你不能-它没有存储在任何地方。文件具有上次修改的 时间(由“ls-l”表示),最后访问的时间(由“ls-lu”表示) 以及inode更改时间(由“ls-lc”显示)。后者通常是 被称为“创建时间”-甚至在某些手册页中- 但这是错误的;它也由mv、ln等操作设置, chm

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

3.1)如何查找文件的创建时间?
你不能-它没有存储在任何地方。文件具有上次修改的
时间(由“ls-l”表示),最后访问的时间(由“ls-lu”表示)
以及inode更改时间(由“ls-lc”显示)。后者通常是
被称为“创建时间”-甚至在某些手册页中-
但这是错误的;它也由mv、ln等操作设置,
chmod、chown和chgrp。
“统计(2)”的手册页对此进行了讨论。
尝试:

不过,它并不能保证在所有系统上都可用。从文档中:

在某些Unix系统(如Linux)上, 以下属性也可以是 可用:st_块(块数 分配给文件),st_blksize (文件系统块大小),st_rdev(类型 设备(如果是inode设备)。 st_标志(用户定义的 文件)

在其他Unix系统上(例如 FreeBSD),以下属性可能会 可供选择(但只能填写) 如果root试图使用它们,则退出):st_gen (文件生成编号),st_生日 (创建文件的时间)


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

间接的解决方案可能是使用一些系统(又称版本控制系统=VCS)来管理需要出生时间的文件

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

当然,您需要以某种方式教育您的用户使用类似于git的VCS,根据线程OS X的HFS和Microsoft的NTFS也都跟踪出生时间,我被告知OS X和Cygwin版本的stat()会返回此信息。至少对于mac而言,哪一项看起来是正确的:

a、m、c、B

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

对于较新的linux文件系统,如ext4、Btrfs和JFS,确实支持这种使用,有一个bash函数,用于提取创建日期时间戳:

如果您处理像EXT4这样的文件系统,您可以恢复文件创建日期-Linux日志文件系统:

改进的时间戳

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

。。。正如Theodore Ts'o所指出的,虽然在inode中添加一个额外的创建日期字段很容易(从而在技术上支持ext4中创建的日期时间戳),但修改或添加必要的系统调用(如stat()(可能需要一个新版本)和依赖于它们的各种库(如glibc)则更为困难. 这些变化需要许多项目的协调。因此,即使ext4开发人员实现了对创建日期时间戳的初始支持,用户程序目前也无法使用此功能。 最后是莱纳斯的最终报价

让我们等五年,看看是否真的有任何共识,它是需要和使用的,而不是匆忙地做一些事情,只是因为“我们可以”


因此,除非文件系统支持,否则这是不可能的,如果文件系统支持,那么您可以使用子进程运行
debugfs
,并解析输出。

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

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

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

xstat(){
对于“${@}”中的目标,请执行以下操作
inode=$(ls-di“${target}”| cut-d'-f1)
fs=$(df“${target}”| tail-1 | awk'{print$1}')
crtime=$(sudo debugfs-R'stat'${fs}”2>/dev/null |
grep-oP'crtime.*-\s*\K.*')
printf“%s\t%s\n”“${crtime}”“${target}”
完成
}

注意这需要sudo。

什么是不能做的[1]?函数os.stat(path).st_birthdime工作得很好

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 [1]: 有人说这不可能 但他笑着回答 “也许不可能”,但他就是其中之一 在他尝试之前谁也不会这么说。 于是他咧嘴一笑,一头扎了进去 在他的脸上。如果他担心,他就把它藏起来。 他在处理事情时开始唱歌 那是不可能的,他做到了! --埃德加·阿尔伯特宾客酒店
由于缺乏良好的实用程序,我创建了

然后你可以像这样使用它:

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调用它):


那么,如果stat不存储文件的创建时间和日期,Linux中是否有一个命令来查找该文件的创建时间和日期呢?一般来说,UNIX文件系统根本不存储创建时间——没有任何方法可以检索从未写入磁盘的数据。截至2019年3月,Linux内核、glibc和coreutils支持
statx()
crtime
。这对我来说很有效:看起来这取决于您使用的文件系统:这是什么?您的答案令人困惑。自2019年3月以来,Linux现在支持it vi 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
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
from crtime import get_crtimes, get_crtimes_in_dir
get_crtimes_in_dir("./")