R语言递归查找指定格式2022年创建文件,file.info过慢求优化
优化R语言查找指定创建日期文件的方案
针对你遇到的file.info处理大量文件耗时过长的问题,有两个更高效的实现思路:
一、利用系统原生命令直接过滤(最快方案)
直接通过系统命令在查找文件时就完成命名规则+创建日期的双重过滤,避免先拉取所有文件再二次处理,速度提升最明显。
Windows系统
使用dir命令递归查找,同时筛选2022年创建的文件:
workdir2 <- "C:/Users/<user>/folder" # 调用Windows dir命令,输出符合条件的完整路径 filelist <- system2( command = "cmd.exe", args = c("/c", sprintf('dir "%s\\DATA_*.xlsx" /s /b /tc | findstr "2022"', workdir2)), stdout = TRUE )
/s:递归查找子目录/b:只输出文件路径/tc:按创建日期筛选(如果要按修改日期用/tw)findstr "2022":过滤日期包含2022的结果
Linux/macOS系统
使用find命令结合时间范围筛选:
workdir2 <- "/Users/<user>/folder" # 调用find命令,查找2022年创建的文件 filelist <- system2( command = "find", args = c(workdir2, "-type", "f", "-name", "DATA_*.xlsx", "-newermt", "2022-01-01", "!", "-newermt", "2023-01-01"), stdout = TRUE )
-newermt 2022-01-01:匹配2022年1月1日之后创建的文件! -newermt 2023-01-01:排除2023年1月1日之后创建的文件,最终得到2022全年的文件
二、使用fs包替代base R的file.info
fs包是专门为文件系统操作优化的R包,底层用C实现,比base R的file.info快得多:
- 先安装并加载依赖包:
install.packages(c("fs", "lubridate")) library(fs) library(lubridate)
- 查找文件并筛选日期:
workdir2 <- "C:/Users/<user>/folder" # 递归查找符合命名规则的文件 filelist <- dir_ls(workdir2, regexp = "^DATA_.*\\.xlsx$", recurse = TRUE) # 获取创建日期并筛选2022年的文件 file_2022 <- filelist[year(file_create(filelist)) == 2022]
dir_ls:功能类似list.files,但性能更优file_create:快速获取文件创建时间,返回POSIXct格式year():从日期中提取年份,由lubridate包提供
内容的提问来源于stack exchange,提问作者megmac
相关产品推荐
相关产品推荐

