R

时间:2019-02-05 16:18:14

标签: r

我正在尝试在R中创建一个简单的csv表输出,该输出仅包含通过目录列出的文件列表(递归)。输出应至少包含3列:

  • 完整路径(例如\ path \ to \ file \ somefile.txt)
  • 文件大小
  • 文件的MD5哈希
  • (其他file.info属性(创建,修改数据等)会有所帮助,但并非绝对必要

我有以下脚本,可以从Internet上的不同地方窃听,可以正常工作,但是我认为这不是“最佳”方法,并且/或者可能比较脆弱。我正在寻求有关如何清理并帮助改善我的R技能的任何意见/建议。谢谢!

*我特别关注cbind的工作原理,以及它如何“知道”是否保留行排列/顺序?

    library(digest)
library(tidyverse)
library(magrittr)

test_dir <- "C:\\Path\\To\\Folder"
outfile <- "out.csv"

file.names <- list.files(test_dir, recursive = TRUE, full.names = TRUE)

md5s <- sapply(file.names, digest, file = TRUE, algo = "md5")

q <- map(file.names, file.info)

file.sizes <- map_df(q, extract, c("size"))

output <- cbind(file.names, file.sizes, md5s)

write_csv(output, str_c("./R/", outfile))

1 个答案:

答案 0 :(得分:1)

一个技巧可能是使用openssl md5函数而不是digest

library(openssl)

md5s <- md5(file.names)

它已经被矢量化了,所以您不需要使用sapply,它可以提高处理速度(取决于您要散列的文件大小)。

对于 cbind ,它将保留您使用键(md5)绑定到的第一列的顺序,因此输出将具有file.names的顺序。