如何批量替换指定目录下文件中的特定代码内容?
如何批量替换指定目录下文件中的特定代码内容?
嘿,这个批量替换的需求其实不难搞定,我给你准备了两种常用环境下的解决方案——Shell脚本(适配Linux/macOS)和PowerShell(适配Windows),都能精准完成你要的两个替换操作:
一、Linux/macOS 用Shell脚本实现
你可以创建一个.sh脚本,执行后就能批量处理目标目录下的文件:
#!/bin/bash # 替换成你实际要处理的目录路径,比如 ./project-files TARGET_DIR="./your-target-folder" # 第一步:全局替换密码行——把 $pw = 'my_password' 换成 $pw = $new_pw find "$TARGET_DIR" -type f -name "*.php" -exec sed -i '' "s/\$pw = 'my_password'/\$pw = \$new_pw/g" {} \; # 第二步:只在包含过原密码行的文件中,替换开头的<?php # 先筛选出符合条件的文件,再逐个处理 find "$TARGET_DIR" -type f -name "*.php" -exec grep -l "\$pw = 'my_password'" {} \; | while read file; do # 确保只替换单独一行的<?php,并且添加换行和include语句 sed -i '' "s/^<?php$/<?php\ninclude('passwords.php');/" "$file" done
脚本说明:
find命令用来遍历目标目录下所有指定后缀的文件(这里是.php,如果是其他文件可以修改-name参数)- 第一个
sed命令是全局替换密码行,注意要转义$避免被Shell解析成变量 - 第二个步骤先通过
grep -l筛选出包含原密码行的文件,再用sed替换开头的<?php,^和$确保是整行匹配,不会误改带注释的<?php行 - 注意:Linux下的
sed不需要-i后面的空字符串,把sed -i ''改成sed -i即可
二、Windows 用PowerShell实现
打开PowerShell,执行以下脚本(记得替换目标目录路径):
# 替换成你实际要处理的目录路径,比如 .\project-files $targetDir = ".\your-target-folder" # 第一步:批量替换密码行 Get-ChildItem -Path $targetDir -Filter "*.php" -Recurse | ForEach-Object { # 读取文件内容并替换,然后写回文件 (Get-Content $_.FullName) -replace '\$pw = ''my_password''', '\$pw = \$new_pw' | Set-Content $_.FullName } # 第二步:在包含原密码行的文件中替换<?php Get-ChildItem -Path $targetDir -Filter "*.php" -Recurse | Where-Object { # 判断文件是否包含原密码行 (Get-Content $_.FullName) -match '\$pw = ''my_password''' } | ForEach-Object { # 读取整个文件内容,确保整行替换<?php $content = Get-Content $_.FullName -Raw $content = $content -replace '^<\?php$', "<?php`ninclude('passwords.php');" Set-Content $_.FullName -Value $content }
脚本说明:
Get-ChildItem用来递归遍历目标目录下的.php文件-replace实现字符串替换,PowerShell里单引号需要用两个单引号转义-Raw参数让Get-Content读取整个文件为字符串,确保能精准匹配单独一行的<?phpn是PowerShell里的换行符,保证include语句在<?php`的下一行
重要注意事项
- 先备份! 批量替换前一定要把目标目录备份一份,避免脚本出错导致文件损坏
- 如果你的文件不是
.php后缀,修改脚本里的-name "*.php"(Shell)或-Filter "*.php"(PowerShell)参数即可,甚至可以去掉该参数处理所有文件 - 测试时可以先找一个测试文件单独运行脚本验证效果,再批量处理
备注:内容来源于stack exchange,提问作者D-T




