如何使用Bash与Sed脚本查找多文件、检查重复并完成重命名操作
Bash + Sed 批量重命名备份文件脚本优化方案
嘿,我来帮你把这个重命名脚本打磨得更靠谱!先把咱们的核心需求再理一遍:
- 要扫描三类备份文件:
*.bak.alt、*.BAK.alt和*.bak - 只有当对应的
*.BAK文件不存在的时候,才执行重命名操作 - 重命名前要做双重校验:如果原文件和目标文件(若已存在)的名称、内容完全一致,就啥也不用做;不一致才完成重命名
原脚本的小问题
你的初始脚本有几个需要调整的地方:
- 漏了处理
*.bak类型的文件 - 用
diff F1.txt F2.txt判断操作的逻辑不对,这只是对比两个搜索结果的文本内容,和咱们的重命名校验逻辑不匹配 - Sed的正则表达式有语法错误(括号转义不正确),而且没有处理文件存在性检查和内容对比
完善后的脚本
我重新写了一个更贴合需求的版本,也保留了你想用Sed/Shell工具的思路:
#!/bin/bash # 定义要搜索的目标文件后缀,统一管理更方便 TARGET_PATTERNS=("*.bak.alt" "*.BAK.alt" "*.bak") echo "开始扫描目标备份文件..." # 遍历所有要处理的文件后缀 for pattern in "${TARGET_PATTERNS[@]}"; do # 找到对应后缀的文件,逐个处理 find . -type f -name "$pattern" | while read -r source_file; do # 根据不同后缀生成对应的目标文件名 *.BAK case "$pattern" in *.bak.alt|*.BAK.alt) # 去掉最后的.bak.alt/BAK.alt后缀,替换为.BAK target_file=$(echo "$source_file" | sed -E 's/(\.bak|\.BAK)\.alt$/.BAK/i') ;; *.bak) # 去掉.bak后缀,替换为.BAK target_file=$(echo "$source_file" | sed -E 's/\.bak$/.BAK/i') ;; esac # 第一步:检查目标文件是否存在 if [ -f "$target_file" ]; then # 第二步:对比原文件和目标文件的内容(静默对比,只返回结果) if cmp -s "$source_file" "$target_file"; then echo "✅ 跳过:$source_file 与 $target_file 内容、名称匹配,无需操作" continue else echo "⚠️ 注意:$target_file 已存在但内容不同,将执行覆盖重命名" fi fi # 执行重命名并显示操作信息 mv -v "$source_file" "$target_file" done done echo "🎉 所有重命名操作已完成!"
脚本核心亮点
- 用数组
TARGET_PATTERNS统一管理要搜索的文件后缀,后续要加新后缀直接改数组就行 - 用Sed来处理文件名的替换,完美贴合你想用Sed的需求,正则表达式更严谨
- 加入了文件存在性检查和内容对比校验,完全符合你要求的逻辑
- 用
cmp -s做静默内容对比,比diff更高效,适合批量处理场景 - 用
mv -v显示操作过程,方便你跟踪每一步的重命名情况
内容的提问来源于stack exchange,提问作者Saeid Herawi
相关产品推荐
相关产品推荐

