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

标签 r filesystems system-calls fileinfo

我正在尝试从 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/

相关文章:

r - 了解累加函数的工作原理

filesystems - 在 iCloud(不带 Pages)中查看文件以进行 iOS 应用程序测试?

c++ - 写入单个大数据文件或多个较小文件: Which is faster?

c - 使用 C 语言使用系统调用查找具有特定扩展名的文件的数量

c - 错误的 TCP 客户端实现

html - 在不同屏幕(台式机、笔记本电脑、移动设备)上调整绝对面板和其中的文本的大小

r - 如何为 R 中的主题建模(topicmodels、lda、tm)准备数据?

r - 什么是空图形设备?

linux - 在脚本中创建临时文件 : Advantages of mktemp over touch-ing a file?

ruby - 为什么 ruby​​ 代码在我第二次调用 exec 后崩溃/退出?