Bash脚本实现文件名日期替换与版本号自动递增
Bash脚本:日期前缀替换+版本号递增(解决文件覆盖问题)
核心功能实现
搞定两个核心需求:自动把文件名前缀换成当日日期,同时从已有版本号接着往上递,适配.md/.pdf等多种文件类型,还彻底解决文件覆盖的坑。
完整脚本
#!/bin/bash # 生成当日标准日期(YYYY-MM-DD) TODAY=$(date +%Y-%m-%d) # 处理传入的所有文件 for file in "$@"; do # 跳过目录,只处理文件 [ -d "$file" ] && continue # 提取文件后缀(自动适配各种格式) ext="${file##*.}" # 剥离后缀后的文件名主体 base_no_ext="${file%.*}" # 解析原文件名,分离日期、核心名称、版本号 if [[ "$base_no_ext" =~ ^([0-9]{4}-[0-9]{2}-[0-9]{2})[[:space:]]+(.*)[[:space:]]+V\.([0-9]+)$ ]]; then # 匹配带旧日期前缀的格式:2023-09-12 Name V.32 old_date="${BASH_REMATCH[1]}" name_core="${BASH_REMATCH[2]}" current_ver="${BASH_REMATCH[3]}" elif [[ "$base_no_ext" =~ ^(.*)[[:space:]]+V\.([0-9]+)$ ]]; then # 匹配无日期前缀但带版本号的格式:Name V.32 name_core="${BASH_REMATCH[1]}" current_ver="${BASH_REMATCH[2]}" old_date="" else # 无版本号的文件,默认从版本1开始 name_core="$base_no_ext" current_ver=0 old_date="" fi # 查找当前目录下,同核心名称、当日日期前缀的所有文件,提取最大版本号 max_ver=0 while IFS= read -r -d '' existing_file; do if [[ "$existing_file" =~ ^\./${TODAY}[[:space:]]+${name_core}[[:space:]]+V\.([0-9]+)\.$ext$ ]]; then ver="${BASH_REMATCH[1]}" (( ver > max_ver )) && max_ver="$ver" fi done < <(find . -maxdepth 1 -type f -name "${TODAY} ${name_core} V.*.${ext}" -print0) # 确定新版本号:取「原版本+1」和「已有最大版本+1」中的较大值,避免覆盖 new_ver=$(( current_ver + 1 > max_ver + 1 ? current_ver + 1 : max_ver + 1 )) # 拼接新文件名 new_file="${TODAY} ${name_core} V.${new_ver}.${ext}" # 执行重命名,-v参数显示操作详情 mv -v "$file" "$new_file" done
关键逻辑说明
- 日期统一:用
date +%Y-%m-%d生成标准格式日期,确保所有文件前缀格式一致 - 多格式适配:自动提取文件后缀,不用单独配置支持的文件类型
- 版本号安全递增:
- 先解析原文件的当前版本号
- 扫描目录里所有同核心名称的当日日期文件,找到已存在的最大版本号
- 最终新版本号取两者加一后的较大值,彻底避免覆盖已有文件
- 兼容多种文件名格式:支持带旧日期前缀、无日期前缀但带版本号、无版本号三种格式的文件
测试场景验证
- 现有文件:
2023-09-12 Name V.32.md和2023-09-13 Name V.33.md - 执行脚本:
./script.sh "2023-09-12 Name V.32.md" - 结果:生成
2023-09-13 Name V.34.md,不会覆盖已有的V.33文件
内容的提问来源于stack exchange,提问作者ReaderGuy42
相关产品推荐
相关产品推荐

