如何编写脚本用其他文件名替换指定文件名中的特定格式部分?
我来帮你分两部分解决这两个文件处理需求,用bash脚本就能搞定,下面是具体实现和说明:
1. 给DR文件夹的文件按数字递增重命名至40
这个需求是把/home/User/Desktop/DR里的文件依次命名为1.ext、2.ext…直到40.ext,脚本会自动保留原文件的后缀:
#!/bin/bash # 目标文件夹路径 DR_DIR="/home/User/Desktop/DR" # 初始化计数器 counter=1 # 遍历文件夹内的所有文件(跳过子目录) for file in "$DR_DIR"/*; do # 只处理普通文件 if [ -f "$file" ]; then # 提取文件后缀(比如.txt、.png) file_ext="${file##*.}" # 重命名文件,格式为「数字.后缀」 mv "$file" "$DR_DIR/$counter.$file_ext" # 计数器加1 ((counter++)) # 达到40就停止处理 if [ $counter -gt 40 ]; then break fi fi done
注意事项:
- 如果DR文件夹里的文件超过40个,脚本只会重命名前40个,剩下的文件保持原样;
- 如果文件少于40个,则只会重命名现有文件,不会生成空文件;
- 脚本会跳过文件夹里的子目录,只处理普通文件。
2. 匹配rsfMRI文件夹的####_##格式并替换对应部分
首先明确匹配规则:文件名是「4位数字(≤40,可重复)_两位数字(仅01或03)」,比如0001_01.nii、0040_03.txt都符合要求。下面分两种常见的替换场景给出脚本:
场景1:把所有符合格式的文件的前4位数字替换为1-40的递增数字(每个数字对应01和03后缀)
比如把XXXX_01.ext替换为0001_01.ext、0002_01.ext…0040_01.ext,03后缀同理:
#!/bin/bash RSFMRI_DIR="/home/User/Desktop/rsfMRI" # 遍历1到40的数字 for num in {1..40}; do # 把数字格式化为4位(比如1→0001,10→0010) formatted_num=$(printf "%04d" $num) # 处理后缀为01的文件 for rs_file in "$RSFMRI_DIR"/*_01.*; do # 匹配「4位数字_01.后缀」的格式 if [[ $rs_file =~ ([0-9]{4})_01\.(.*) ]]; then # 替换前4位数字为格式化后的数字 new_file="${RSFMRI_DIR}/${formatted_num}_01.${BASH_REMATCH[2]}" mv "$rs_file" "$new_file" fi done # 处理后缀为03的文件 for rs_file in "$RSFMRI_DIR"/*_03.*; do if [[ $rs_file =~ ([0-9]{4})_03\.(.*) ]]; then new_file="${RSFMRI_DIR}/${formatted_num}_03.${BASH_REMATCH[2]}" mv "$rs_file" "$new_file" fi done done
场景2:和DR文件夹的重命名结果对应替换
比如DR里的1.txt对应rsfMRI里的XXXX_01.txt→1_01.txt、XXXX_03.txt→1_03.txt,以此类推:
#!/bin/bash DR_DIR="/home/User/Desktop/DR" RSFMRI_DIR="/home/User/Desktop/rsfMRI" counter=1 # 遍历DR里已重命名的文件 for dr_file in "$DR_DIR"/*; do if [ -f "$dr_file" ]; then file_ext="${dr_file##*.}" # 替换rsfMRI里对应后缀的01文件 for rs_file in "$RSFMRI_DIR"/*_01.$file_ext; do if [[ $rs_file =~ ([0-9]{4})_01\.$file_ext ]]; then mv "$rs_file" "$RSFMRI_DIR/${counter}_01.$file_ext" fi done # 替换rsfMRI里对应后缀的03文件 for rs_file in "$RSFMRI_DIR"/*_03.$file_ext; do if [[ $rs_file =~ ([0-9]{4})_03\.$file_ext ]]; then mv "$rs_file" "$RSFMRI_DIR/${counter}_03.$file_ext" fi done ((counter++)) if [ $counter -gt 40 ]; then break fi fi done
使用方法:
- 把上面的脚本复制到文本编辑器,保存为
rename_files.sh; - 打开终端,给脚本添加执行权限:
chmod +x rename_files.sh; - 运行脚本:
./rename_files.sh。
内容的提问来源于stack exchange,提问作者hsayya
相关产品推荐
相关产品推荐

