【发布时间】:2014-06-12 16:15:52
【问题描述】:
我正在尝试从 R 获取文件创建日期,并且我了解在某些不将其存储在任何地方的操作系统上,可能根本无法检索此信息。但是,我不确定当它(至少理论上)可检索时如何一般地检索它。
在 Windows 上,这很简单,因为来自file.info 的ctime 提供了此信息,供参考,这是来自?file.info 的相关摘录
三个文件时间的含义取决于操作系统和文件系统。在 Windows 本地文件系统上,ctime 是文件创建时间(在大多数类 Unix 文件系统上没有记录的时间)。
然而,尽管大多数 unix 系统不记录此信息(如帮助中所指出的),但某些基于 unix 的系统(例如 OS X)实际上会存储此信息。例如,在 OS X 上,系统命令 metadata ls mdls 将打印文件元数据并将kMDItemContentCreationDate(文件的实际创建日期)列为文件属性之一。
我的问题是,对于从文件元数据中获取文件创建日期(如果有的话),人们有什么建议? (例如,特别是在有系统命令但没有直接 R 调用的 OS X 的情况下)
更新:
感谢来自 cmets 的信息 + 有关 SO 和 SE here 和 here 的详细信息,我想出了一种方法来在跟踪创建日期并具有 @ 的 OS X 类型 unix 平台上的 R 中解决此问题987654323@。但是,我仍然无法弄清楚如何在其他跟踪创建日期但没有此版本stat 的 Linux 系统上的 R 中执行此操作。在unix SE 的这个答案中,建议可以使用debugfs + stat 检索此信息,即使stat 本身没有报告它(提供文件系统记录生日),但该解决方案我无法开始工作(只有我可以测试的 linux 没有debugfs)。无论如何,这就是我得到了多远:
get_birthdate <- function(filepath) {
switch(Sys.info()[['sysname']],
Windows = {
# Windows
file.info(filepath)$ctime
},
Darwin = {
# OS X
cmd <- paste('stat -f "%DB"', filepath) # use BSD stat command
ctime_sec <- as.integer(system(cmd, intern=T)) # retrieve birth date in seconds from start of epoch (%DB)
as.POSIXct(ctime_sec, origin = "1970-01-01", tz = "") # convert to POSIXct
},
Linux = {
# Linux
stop("not sure how to do this")
})
}
【问题讨论】:
-
在 unix 系统上,ctime(可能)是创建目录条目的时间,但可能与创建文件的时间不同。这是因为 unix 文件系统上的文件可能有多个指向它们的目录条目; Windows 不允许这样做,因此唯一的 ctime 将是实际的文件创建时间。
-
好吧,我知道你不能只在 Unix 上使用
file.info('yourfilename')['ctime']。 -
是的,不幸的是,unix上的
file.info中的ctime只是“最后一次状态更改”的时间,如果我理解正确的话,基本上将任何文件内容的最后一次更改时间记录为以及文件所有权等方面的非数据更改,也就是说,它更像mtime,并且不包含有关创建时间(目录条目或其他)的任何信息 -
file.info使用stat,对于大多数 Linux 文件系统,您不会获得创建时间。stat返回最后一个 [访问|mod|状态更改]。 Ext4 (linux) 存储创建时间 (crtime) 但您无法从 R 获取它。NTFS 也存储真实创建时间,但我也不知道如何从 R 获取它。这个SE:unix.stackexchange.com/questions/50177/birth-is-empty-on-ext4 线程可能会有所帮助。
标签: r filesystems system-calls fileinfo