gpt4 book ai didi

r - 如何在 Unix 系统上的 R 中获取真实的文件创建日期?

转载 作者:行者123 更新时间:2023-12-02 04:55:20 24 4
gpt4 key购买 nike

我正在尝试从 R 中获取文件创建日期,并且我知道在某些操作系统上可能根本无法检索此信息,因为这些操作系统不会将其存储在任何地方。但是,当它(至少,理论上)可检索时,我不确定如何检索它。

在 Windows 上,这很简单,因为 file.info 中的 ctime 提供了此信息,供引用,这是 ?file.info 的相关摘录

What is meant by the three file times depends on the OS and file system. On Windows native file systems ctime is the file creation time (something which is not recorded on most Unix-alike file systems).

然而,尽管大多数 unix 系统不记录此信息(如帮助中所指出的),但某些基于 unix 的系统(如 OS X)实际上会存储此信息。例如,在 OS X 上,系统命令 metadata ls mdls 将打印文件元数据并将 kMDItemContentCreationDate(文件的实际创建日期)列为文件属性之一。

我的问题是,人们对从文件元数据中获取文件创建日期(如果有的话)有什么建议? (例如,特别是在有系统命令但没有直接 R 调用的 OS X 的情况下)

更新:

感谢评论中的信息+关于 SO 和 SE 的详细信息 herehere ,我想出了一种方法来在 OS X 类型的 unix 平台上的 R 中解决这个问题,该平台跟踪创建日期并具有 BSD style stat command .但是,我仍然无法弄清楚如何在跟踪创建日期但没有此版本的 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")
})
}

最佳答案

按照其他人的指示,这应该 工作得相当合理。不幸的是,它需要 root 权限(由于 debugfs)并且它还不是很有效(尤其是在正则表达式上有点快,但现在是凌晨 01:00 点 :))。

顺便说一句,我们将寻呼机设置为 cat(使 debugfs 在标准输出上打印),查找文件存储在哪个设备中以便使用 debugfs 正确并最终获得统计信息并对其进行详细说明。

一般来说,在 UNIX 中,一旦你有一个 bash 命令来读取它在 R 中的输出,你就必须在 read 中使用 pipe模式(默认)和 readLines

在 Debian Gnu Linux 中完成的测试。

np350v5c:/home/l# R
> my.file <- "/etc/network/interfaces"
>
> setup_pager <- function() {system("export PAGER=cat")}
>
> where_is <- function(file) {
con <- pipe(sprintf("df %s", file))
res <- strsplit(readLines(con)[2], " ")[[1]][1]
close(con)
res
}
>
> where_is(my.file) # could be /dev/sda1 as well, depending on /etc/fstab
[1] "/dev/disk/by-uuid/9ce40c2b-60d8-40b1-890f-1e5da4199c88"
>
> my.command <- sprintf("debugfs -R 'stat %s' %s",
my.file,
where_is(my.file))
>
> ## root privileges especially here ..
> setup_pager()
> con <- pipe(my.command)
> debugfs <- readLines(con)
debugfs 1.42.9 (4-Feb-2014)
> close(con)
>
> my.date <- gsub("^crtime:.+-- ", "", grep("^crtime", debugfs, value = TRUE))
> my.date
[1] "Tue Feb 19 00:07:21 2013"
> strptime(tolower(substr(my.date, 5, nchar(my.date))),
format = "%b %d %H:%M:%S %Y")
[1] "2013-02-19 00:07:21 CET"

HTH,卢卡

关于r - 如何在 Unix 系统上的 R 中获取真实的文件创建日期?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23318695/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com