如何用R随机修改文件的创建与修改日期?
修改文件创建日期(ctime)并随机设置日期的R解决方案
首先得明确:R原生的Sys.setFileTime()只能修改文件的修改时间(mtime)和访问时间(atime),没办法直接修改创建时间(ctime)——因为ctime属于文件系统级别的元数据,需要调用对应系统的命令行工具来修改。下面分平台给你适配的方案,同时满足你「一年内随机设置不同创建/修改日期」的需求。
1. 核心思路:结合系统命令修改ctime
不同操作系统修改创建时间的命令不一样,我们可以写一个跨平台的R函数来封装这些命令,再结合随机日期生成逻辑批量处理文件。
2. 跨平台修改创建时间的R函数
先定义一个通用函数,自动识别操作系统并调用对应命令:
set_creation_time <- function(file_path, creation_date) { # 统一将日期转为POSIXct格式 creation_date <- as.POSIXct(creation_date) if (.Platform$OS.type == "windows") { # Windows用PowerShell修改创建时间 ps_date_str <- format(creation_date, "%Y-%m-%d %H:%M:%S") cmd <- sprintf('powershell -Command "(Get-Item \'%s\').CreationTime = \'%s\'"', file_path, ps_date_str) system(cmd, invisible = TRUE) } else if (Sys.info()["sysname"] == "Darwin") { # macOS系统 # macOS需要Xcode命令行工具,先运行xcode-select --install安装 mac_date_str <- format(creation_date, "%m/%d/%Y %H:%M:%S") cmd <- sprintf('SetFile -d "%s" "%s"', mac_date_str, file_path) system(cmd, invisible = TRUE) } else { # Linux系统 # Linux修改ctime需要root权限,操作前请备份数据! # 先获取当前的atime和mtime,避免修改ctime后被覆盖 file_info <- file.info(file_path) atime_str <- format(file_info$atime, "%Y%m%d%H%M.%S") mtime_str <- format(file_info$mtime, "%Y%m%d%H%M.%S") ctime_str <- format(creation_date, "%Y%m%d%H%M.%S") # 使用debugfs修改ctime(需要替换/dev/sda1为你的根分区设备) cmd_ctime <- sprintf('sudo debugfs -w -R "set_inode_field %s ctime %s" /dev/sda1', file_path, ctime_str) # 同步atime和mtime cmd_atime <- sprintf('touch -a -t %s "%s"', atime_str, file_path) cmd_mtime <- sprintf('touch -m -t %s "%s"', mtime_str, file_path) system(cmd_atime, invisible = TRUE) system(cmd_mtime, invisible = TRUE) system(cmd_ctime, invisible = TRUE) } }
3. 批量随机设置日期的完整脚本
接下来结合你的需求,生成2020年全年内的随机日期,为每个文件设置不同的创建和修改时间(确保创建时间≤修改时间,符合真实逻辑):
# 替换为你的目标文件夹路径 target_folder <- "C:/Users/cariou-w/Nextcloud/sync-uncloud/1920-1921/master/web_scrapping/plans" # 获取文件夹内所有文件的完整路径 file_list <- list.files(target_folder, full.names = TRUE) # 定义日期范围:2020年全年(精确到分钟) start_dt <- as.POSIXct("2020-01-01 00:00:00") end_dt <- as.POSIXct("2020-12-31 23:59:59") # 批量处理每个文件 sapply(file_list, function(file) { # 生成随机创建时间(2020年内任意分钟) random_ctime <- sample(seq(start_dt, end_dt, by = "min"), 1) # 生成随机修改时间:必须晚于或等于创建时间 random_mtime <- sample(seq(random_ctime, end_dt, by = "min"), 1) # 修改文件修改时间(用你熟悉的Sys.setFileTime) Sys.setFileTime(file, random_mtime) # 修改文件创建时间 set_creation_time(file, random_ctime) # 可选:打印处理日志,方便验证 cat(sprintf("已处理:%s\n创建时间:%s\n修改时间:%s\n\n", basename(file), random_ctime, random_mtime)) })
4. 注意事项
- Windows:无需额外安装工具,PowerShell默认可用;
- macOS:需要先安装Xcode命令行工具,终端运行
xcode-select --install完成安装; - Linux:修改ctime需要root权限,且
/dev/sda1需要替换为你的系统根分区设备(可以用df /查看),操作前请务必备份文件,避免损坏文件系统; - 如果你只需要按天随机,把
by = "min"改成by = "day"即可; - 逻辑合理性:设置修改时间时确保不早于创建时间,避免出现不符合常识的文件时间。
内容的提问来源于stack exchange,提问作者Wilcar
相关产品推荐
相关产品推荐

