在r中查找文件所有者

7
有各种基本函数可以获取有关文件的信息。目前我正在使用免费软件SearchMyFiles来完成这项工作。但是,我更喜欢用r来做这件事。
我想搜索硬盘中特定类型的文件夹,然后将找到的文件的路径和信息返回到数据框中,更具体地说,由于这些文件有不同的所有者,我想返回文件的所有者。
我尝试过的函数是file.info()list.files()
然而,file.info(path, extra_cols = TRUE)不会返回文件的所有者。相反,它返回以下内容:
 size isdir  mode mtime               ctime               atime               exe
10689 FALSE  666  2017-03-01 12:00:47 2017-03-01 12:00:47 2017-03-01 12:00:47  no

1) 通过file.info()可以找到文件的所有者吗?

2) 是否有一种简洁的方法来搜索所有具有特定名称的文件夹,并返回这些文件夹中找到的文件的信息?

例如:

list.files(path_to_harddrive, folder_string) %>%
file.info()

这个问题 解决了相关的技术问题,但没有被接受的答案。

> as.data.frame(Sys.info())
                               Sys.info()
sysname                           Windows
release                             7 x64
version        build 7601, Service Pack 1
machine                               x86

1
你可以使用sapply(list.files(path_to_harddrive, folder_string), file.info)在一堆文件上运行file.info。但是不知道如何提取文件所有者。 - ikop
2
你可以使用类似 system("cmd", input = "dir /q", intern = T) 的东西。解析旧的大文本块。 - Vlo
很棒的@Vlo可以返回所有者,但是它的格式不容易存储到数据框中。当然,我猜你可以清理一下,但应该有更简单的方法。 - FilipW
可以使用substr()函数将原始CMD输出分解为数据框。需要进行一些数据分析(起始和结束位置),但这是值得的。 - cineS.
2个回答

1
提供的答案不具有平台独立性,对于我来说,在Windows网络驱动器上无法工作。
我想出了这段代码,如果不是在Windows上,它将使用fs包(由RStudio团队开发),否则将使用一个非常丑陋的脚本。Windows可以使用批处理命令dir和/Q标志来检索所有者。
这段代码可以完成工作:
get_owner <- function(path) {
  if (Sys.info()["sysname"] == "Windows") {
    dir <- shell(paste0('dir /Q "', path, '"'), intern = TRUE)
    if (tools::file_ext(basename(path)) == "") {
      # it's a folder
      return(gsub(".*<DIR>[ \t]+([^ ]*).*", "\\1", dir[grepl("<DIR>", dir)][1]))
    } else {
      # it's a file
      return(trimws(gsub(basename(path), "",
                         gsub("^[0-9: \t.-]+", "",
                              dir[grepl(basename(path), dir)]),
                         fixed = TRUE)))
    }
  } else {
    return(fs::file_info(path)$user)
  }
}

然后像这样使用:
get_owner("/Folder/Folder")
get_owner("/Folder/File")
get_owner("C:/Folder/Folder")
get_owner("C:/Folder/File")

0
为了将文件所有者转换成数据框,可以采用类似以下的方法;
library(tidyverse)
data <- tibble(path = list.files(path_to_harddrive, folder_string)) %>%
    mutate(user = file.info(path)$uname)

对我来说,这似乎相当慢,所以我想有更快的方法!


看不出这为什么是被接受的答案 - unamefile.info() 的输出中根本不是一个元素。至少在 Windows 中不是这样,所以最好的情况是它依赖于操作系统,并且只在(也许)UNIX系统上有效。 - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接