如何用R或Bash基于TXT映射表批量修改指定文件名?
文件批量重命名解决方案
不管用Bash还是R,第一步一定要先备份文件,避免操作失误导致数据丢失。下面分别给出两种工具的实现方法:
Bash 实现
- 先备份目标文件:
cp -r ./你的文件目录 ./你的文件目录_backup
- 执行以下脚本完成重命名(把
mapping.txt换成你的映射文件名):
# 建立COMP_ID到CHEM_ID的映射关联数组 declare -A chem_map while read -r chem comp; do if [[ $chem != "CHEM_ID" ]]; then chem_map["$comp"]="$chem" fi done < mapping.txt # 遍历并处理每个目标文件 for file in BIB.metmss_*.txt.gz; do # 提取文件名中的metmss_xxxx部分 comp_id=$(echo "$file" | grep -o 'metmss_[0-9]*') # 获取对应的CHEM_ID chem_id=${chem_map["$comp_id"]} if [[ -n $chem_id ]]; then # 构造新文件名:替换metmss为C,插入对应的CHEM_ID new_name=$(echo "$file" | sed "s/metmss_\([0-9]*\)/${chem_id}.C\1/") # 先打印预览重命名结果,确认无误后去掉echo执行实际重命名 echo mv "$file" "$new_name" # mv "$file" "$new_name" else echo "警告:文件$file中的$comp_id未在映射表中找到对应CHEM_ID" fi done
注意:先运行带
echo的命令,确认输出的重命名逻辑正确后,再注释掉echo,执行实际的mv命令。
R 实现
- 先备份目标文件:
# 创建备份目录 dir.create("file_backup", showWarnings = FALSE) # 复制所有目标文件到备份目录 file.copy(list.files(pattern = "BIB.metmss_*.txt.gz"), "file_backup")
- 执行以下代码完成重命名(需要先安装
stringr包,若未安装可运行install.packages("stringr")):
library(stringr) # 读取映射文件 map_table <- read.table("mapping.txt", header = TRUE, stringsAsFactors = FALSE) # 转换为命名向量,方便快速查找 chem_mapping <- setNames(map_table$CHEM_ID, map_table$COMP_ID) # 获取所有需要重命名的文件 target_files <- list.files(pattern = "BIB.metmss_*.txt.gz") # 逐个处理文件 for (file in target_files) { # 提取文件名中的metmss_xxxx部分 comp_id <- str_extract(file, "metmss_[0-9]+") # 查找对应的CHEM_ID chem_id <- chem_mapping[comp_id] if (!is.na(chem_id)) { # 构造新文件名 new_name <- str_replace(file, "metmss_([0-9]+)", paste0(chem_id, ".C\\1")) # 先打印预览结果,确认无误后启用file.rename cat("重命名:", file, "->", new_name, "\n") # file.rename(file, new_name) } else { message("警告:文件", file, "中的", comp_id, "未在映射表中找到对应CHEM_ID") } }
注意:先运行带
cat的代码确认重命名逻辑正确,再注释掉cat,启用file.rename执行实际重命名。
内容的提问来源于stack exchange,提问作者ayeepi
相关产品推荐
相关产品推荐

