如何使用R批量偏移生物声学wav序列文件名的时间戳
R语言批量重命名实现方案
核心思路是先从文件名提取设备自带的错误时间戳,按录制顺序排序后,以你记录的真实起始时间为基准,按固定录制间隔逐个计算每个文件的真实时间戳,生成新文件名后批量完成重命名,全程不需要手动计算时间偏移量。
操作步骤
- 先将所有待处理的wav文件集中到单独的文件夹,务必备份全量原始文件,避免重命名操作失误造成数据损失。
- 安装基础R环境即可运行,不需要额外依赖第三方包。
- 修改代码开头的配置参数,填入你本地的文件路径、设备名、真实起始时间,直接运行即可完成批量处理。
# -------------------------- 请修改以下参数 -------------------------- # 存放待重命名wav文件的文件夹路径,Windows路径注意把反斜杠改成正斜杠或者双反斜杠 file_dir <- "C:/your/path/to/wav/folder" # 设备名,和文件名前缀保持一致 device_name <- "swift1" # 真实录制起始时间,格式为"YYYY-MM-DD HH:MM:SS",按野外记录的实际值填写 real_start_time <- as.POSIXct("2022-06-17 09:30:00", tz = "UTC") # 单个文件的录制时长,单位为分钟 file_duration_min <- 20 # ------------------------------------------------------------------- # 读取目录下所有匹配命名规则的wav文件 all_files <- list.files( path = file_dir, pattern = paste0("^", device_name, "_.*\\.wav$"), full.names = FALSE ) # 基础校验:未找到匹配文件时终止运行并提示 if (length(all_files) == 0) { stop("对应路径下未找到匹配命名格式的wav文件,请检查路径和设备名配置") } # 从文件名解析设备记录的错误时间戳 wrong_timestamps <- as.POSIXct( gsub( pattern = paste0("^", device_name, "_(\\d{8})_(\\d{6})\\.wav$"), replacement = "\\1\\2", x = all_files ), format = "%Y%m%d%H%M%S", tz = "UTC" ) # 按错误时间戳从小到大排序,严格匹配录制生成顺序 file_order <- order(wrong_timestamps) sorted_files <- all_files[file_order] # 逐个计算对应真实时间:第一个文件对齐真实起始时间,后续每个文件累加固定录制时长 real_timestamps <- real_start_time + (seq_along(sorted_files) - 1) * file_duration_min * 60 # 生成符合原命名规则的新文件名 new_filenames <- paste0( device_name, "_", format(real_timestamps, "%Y%m%d"), "_", format(real_timestamps, "%H%M%S"), ".wav" ) # 执行批量重命名 rename_result <- file.rename( from = file.path(file_dir, sorted_files), to = file.path(file_dir, new_filenames) ) # 输出处理结果统计 cat(sprintf("重命名完成:共成功处理%d个文件,失败%d个\n", sum(rename_result), sum(!rename_result))) # 存在失败文件时打印对应文件名,方便排查 if (sum(!rename_result) > 0) { cat("重命名失败的文件如下:\n") cat(sorted_files[!rename_result], sep = "\n") }
关键说明
- 代码通过正则表达式从文件名解析时间戳,不依赖文件系统的创建时间、修改时间,不会因为文件拷贝、移动导致顺序错乱。
- 排序逻辑严格按照设备生成的原始时间戳排列,完全匹配实际录制顺序,即使中途存在漏录文件,也不会导致后续文件的时间偏移。
- 时间计算统一指定时区,避免夏令时、系统时区切换导致的时间偏移错误,国内使用可将代码中
tz参数改为"Asia/Shanghai"。 - 采用向量化的重命名操作,处理2000余个文件仅需数秒即可完成,运行结束后会输出明确的成功/失败统计,方便校验结果。
内容的提问来源于stack exchange,提问作者Carly Batist
相关产品推荐
相关产品推荐

