批量文件重命名与内容替换自动化脚本
要替换的旧关键词与新关键词(默认值可通过 make 命令覆盖)OLD_KEY?NEW_KEY?# 排除规则:使用 find 命令的路径与名称匹配,忽略版本库、依赖目录和备份文件# 封装的 find 命令,供后续目标复用说明OLD_KEY 和 NEW_KEY:定义要替换的关键词,默认值为 old_keyword 和 new_keyword,可在执行 make 时通过命令行参数覆盖(例如 make O
当项目重构需要批量重命名文件和替换内容时,手动操作既繁琐又易出错。这份 Makefile 脚本提供了一套自动化解决方案,核心功能是批量替换文件名称和文件内容中的关键词。它通过灵活定义新旧关键词、智能排除关键目录(如 .git、node_modules)与备份文件,并整合了预览、正式替换和备份清理等完整流程,旨在提升重构效率并确保操作安全。
这是一份用于批量替换文件名和文件内容中关键词的 Makefile 脚本,支持排除指定目录或文件(如 .git、node_modules、备份文件),并提供预览、备份和清理功能。以下是详细说明:
一、变量定义(核心参数与搜索规则)
# 要替换的旧关键词与新关键词(默认值可通过 make 命令覆盖)
OLD_KEY ?= old_keyword
NEW_KEY ?= new_keyword
# 排除规则:使用 find 命令的路径与名称匹配,忽略版本库、依赖目录和备份文件
EXCLUDE_DIRS := -not -path "./.git/*" -not -path "./node_modules/*"
EXCLUDE_FILES := -not -name "*~"
# 封装的 find 命令,供后续目标复用
FIND_FILES = find . -type f $(EXCLUDE_DIRS) $(EXCLUDE_FILES)
FIND_ALL = find . $(EXCLUDE_DIRS) $(EXCLUDE_FILES)
说明
-
OLD_KEY 和 NEW_KEY:定义要替换的关键词,默认值为 old_keyword 和 new_keyword,可在执行 make 时通过命令行参数覆盖(例如 make OLD_KEY=foo NEW_KEY=bar all)。
-
EXCLUDE_DIRS 与 EXCLUDE_FILES:使用 find 的 -not -path 和 -not -name 选项,分别排除 .git 目录、node_modules 目录以及以 ~ 结尾的备份文件。
-
FIND_FILES 与 FIND_ALL:封装好的 find 命令变量,FIND_FILES 仅查找文件,FIND_ALL 查找文件和目录,便于在多个目标中复用,避免重复编写复杂的排除条件。
二、伪目标声明
.PHONY: all rename_files replace_content dry_run clean_backup
-
将这些目标声明为 伪目标(.PHONY),确保 make 总是执行对应的命令,即使当前目录下存在同名文件也不会跳过。
三、总入口目标:all
all: rename_files replace_content
-
默认执行顺序:先执行 rename_files 替换文件名,再执行 replace_content 替换文件内容,完成完整的批量替换。
四、目标1:rename_files(替换文件名中的关键词)
rename_files:
@echo "正在替换文件名中的 ${OLD_KEY} -> ${NEW_KEY} ..."
@$(FIND_ALL) -depth -name "*${OLD_KEY}*" \
-exec bash -c 'mv "$$0" "$${0//${OLD_KEY}/${NEW_KEY}}"' {} \; 2>/dev/null || true
功能与参数说明
-
功能:递归查找所有符合条件的文件和目录,将名称中包含 OLD_KEY 的部分替换为 NEW_KEY。
-
-depth:深度优先遍历,确保先处理子项再处理父项,避免重命名父目录导致子文件路径失效。
-
-name "*${OLD_KEY}*":匹配名称中包含 OLD_KEY 的项。
-
-exec ...:对每个匹配项执行 Shell 命令。bash -c 中的 $$0 是 find 传递的文件路径参数,$${0//${OLD_KEY}/${NEW_KEY}} 是 Shell 的模式替换语法,将路径中的 OLD_KEY 全部替换为 NEW_KEY,然后使用 mv 命令重命名。
-
2>/dev/null || true:将标准错误重定向到 /dev/null(忽略错误信息),并通过 || true 确保该命令的退出状态码为 0(成功),避免因为没有匹配文件导致 make 执行中断。
五、目标2:replace_content(替换文件内容中的关键词)
replace_content:
@echo "正在替换文件内容中的 ${OLD_KEY} -> ${NEW_KEY} ..."
@$(FIND_FILES) -exec sed -i.bak -e 's/${OLD_KEY}/${NEW_KEY}/g' {} \;
@echo "已生成备份文件(.bak),确认无误后运行 make clean_backup 删除备份"
功能与参数说明
-
功能:递归查找所有符合条件的文件,并使用 sed 命令将文件内容中所有 OLD_KEY 替换为 NEW_KEY,同时为原文件生成 .bak 后缀的备份。
-
sed -i.bak:-i 表示就地编辑(in-place edit),.bak 指定备份文件的后缀。执行后,原文件被修改,同时生成一个内容为修改前的备份文件(如 file.txt.bak)。
-
s/${OLD_KEY}/${NEW_KEY}/g:sed 的替换命令。s 表示替换(substitute),g 表示全局(global)替换,即替换每一行中所有匹配的 OLD_KEY。
-
最后一行输出提示用户备份文件已生成,并告知清理方法。
六、目标3:dry_run(安全预览)
dry_run:
@echo "生成预览文件 preview.txt ..."
@# 文件名替换预览
@$(FIND_ALL) -name "*${OLD_KEY}*" -exec bash -c 'echo "重命名:\"$$0\" -> \"$${0//${OLD_KEY}/${NEW_KEY}}\""' {} \; >> preview.txt 2>/dev/null || true
@echo "===== 文件内容匹配预览 =====" >> preview.txt
@# 文件内容匹配预览
@$(FIND_FILES) -exec grep -H -n --color=never "${OLD_KEY}" {} \; >> preview.txt 2>/dev/null || true
@echo "提示:使用 less 或编辑器查看完整内容(如 less preview.txt)"
功能与参数说明
-
功能:执行模拟操作,不实际修改任何文件。将文件名替换的预期结果和文件内容中匹配 OLD_KEY 的行输出到 preview.txt 文件,供用户检查。
-
文件名预览:使用 find 查找名称包含 OLD_KEY 的项,并通过 bash -c 输出重命名前后的路径对比。
-
内容匹配预览:使用 grep 搜索文件内容中所有包含 OLD_KEY 的行。
-
-H:显示文件名。
-
-n:显示行号。
-
--color=never:禁用颜色高亮,确保输出为纯文本。
-
-
所有输出(包括标准错误)被追加到 preview.txt,错误被忽略以保证命令继续执行。
-
最后提示用户如何使用 less 或文本编辑器查看生成的预览文件。
七、目标4:clean_backup(清理备份文件)
clean_backup:
@echo "正在清理备份文件 ..."
@find . -name "*.bak" -delete
功能与参数说明
-
功能:递归查找当前目录及子目录下所有以 .bak 结尾的文件,并删除它们。
-
find . -name "*.bak" -delete:-delete 动作会直接删除匹配到的文件,无需额外命令。
使用流程示例
-
预览(安全验证):
make dry_run
执行后,检查生成的 preview.txt 文件,确认替换逻辑符合预期。
-
执行替换:
make all
或直接 make。此命令将依次执行 rename_files 和 replace_content,完成文件名和文件内容的批量替换,并生成 .bak 备份文件。
-
清理备份:
make clean_backup
在所有替换确认无误后,运行此命令删除所有 .bak 备份文件。
-
自定义关键词: 若要替换的关键词不是默认的 old_keyword 和 new_keyword,可以在执行 make 时通过命令行参数指定:
make OLD_KEY=original NEW_KEY=replacement all
注意事项
-
排除规则:脚本已默认排除 .git 目录、node_modules 目录以及形如 *~ 的备份文件,防止对版本控制系统、依赖包或临时文件进行误操作。如需排除其他路径,可修改 EXCLUDE_DIRS 或 EXCLUDE_FILES 变量。
-
备份机制:replace_content 目标会为每个被修改的文件生成一个 .bak 备份。请在替换后仔细核对,确认无误后再使用 make clean_backup 清理,以防需要回滚。
-
操作安全:强烈建议在正式执行替换前,先运行 make dry_run 预览结果。预览文件 preview.txt 包含了所有将被影响的文件名和文件内容的具体行,是验证替换范围的关键。
该 Makefile 通过模块化设计,将文件名替换、内容替换、预览和清理功能分离为独立目标,逻辑清晰且易于复用。结合排除规则和备份机制,为项目重构、变量名批量更改或敏感词替换等场景提供了安全、高效的解决方案。
八、完整脚步(脚本)汇总
# 要替换的旧关键词与新关键词(默认值可通过 make 命令覆盖)
OLD_KEY ?= old_keyword
NEW_KEY ?= new_keyword
# 排除规则:使用 find 命令的路径与名称匹配,忽略版本库、依赖目录和备份文件
EXCLUDE_DIRS := -not -path "./.git/*" -not -path "./node_modules/*"
EXCLUDE_FILES := -not -name "*~"
# 封装的 find 命令,供后续目标复用
FIND_FILES = find . -type f $(EXCLUDE_DIRS) $(EXCLUDE_FILES)
FIND_ALL = find . $(EXCLUDE_DIRS) $(EXCLUDE_FILES)
.PHONY: all rename_files replace_content dry_run clean_backup
all: rename_files replace_content
rename_files:
@echo "正在替换文件名中的 ${OLD_KEY} -> ${NEW_KEY} ..."
@$(FIND_ALL) -depth -name "*${OLD_KEY}*" \
-exec bash -c 'mv "$$0" "$${0//${OLD_KEY}/${NEW_KEY}}"' {} \; 2>/dev/null || true
replace_content:
@echo "正在替换文件内容中的 ${OLD_KEY} -> ${NEW_KEY} ..."
@$(FIND_FILES) -exec sed -i.bak -e 's/${OLD_KEY}/${NEW_KEY}/g' {} \;
@echo "已生成备份文件(.bak),确认无误后运行 make clean_backup 删除备份"
dry_run:
@echo "生成预览文件 preview.txt ..."
@# 文件名替换预览
@$(FIND_ALL) -name "*${OLD_KEY}*" -exec bash -c 'echo "重命名:\"$$0\" -> \"$${0//${OLD_KEY}/${NEW_KEY}}\""' {} \; >> preview.txt 2>/dev/null || true
@echo "===== 文件内容匹配预览 =====" >> preview.txt
@# 文件内容匹配预览
@$(FIND_FILES) -exec grep -H -n --color=never "${OLD_KEY}" {} \; >> preview.txt 2>/dev/null || true
@echo "提示:使用 less 或编辑器查看完整内容(如 less preview.txt)"
clean_backup:
@echo "正在清理备份文件 ..."
@find . -name "*.bak" -delete
使用说明
-
安全预览:首次替换前,运行 make dry_run 生成 preview.txt 文件,检查替换范围是否符合预期。
-
正式执行:运行 make all(或直接 make)执行完整的文件名和内容替换,并自动生成 .bak 备份文件。
-
清理备份:替换操作确认无误后,运行 make clean_backup 删除所有备份文件。
-
自定义关键词:可在执行命令时直接指定关键词,例如 make OLD_KEY=foo NEW_KEY=bar all,将 foo 全局替换为 bar。
更多推荐
所有评论(0)