如何用Java在Windows下批量替换目录中多个文件夹名称的指定字符串
批量重命名目录下子文件夹的解决方案
问题分析
你当前的Java代码只能实现单个目录的重命名,没法遍历目标目录下的所有子文件夹并批量替换名称里的特定字符串(比如把Folder_is_替换成Folder_)。咱们只需要调整代码逻辑,遍历目标目录下的所有子项,筛选出文件夹后做名称替换就行。
修改后的Java代码
这个版本支持批量替换子文件夹名称中的指定字符串,你可以自定义要替换的旧内容和新内容:
import java.io.File; import java.util.Scanner; public class BatchRenameFolders { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); // 输入存放待重命名文件夹的目标目录路径 System.out.println("请输入包含待重命名文件夹的目录路径:"); String targetDirPath = scanner.nextLine(); File targetDir = new File(targetDirPath); if (!targetDir.isDirectory()) { System.err.println("输入的路径不是有效目录!"); scanner.close(); System.exit(0); } // 输入要替换的旧字符串和新字符串 System.out.println("请输入要替换的旧字符串(比如Folder_is_):"); String oldStr = scanner.nextLine(); System.out.println("请输入替换后的新字符串(比如Folder_):"); String newStr = scanner.nextLine(); // 获取目标目录下的所有子项 File[] subItems = targetDir.listFiles(); if (subItems == null || subItems.length == 0) { System.err.println("目标目录下没有任何子项!"); scanner.close(); System.exit(0); } int renameCount = 0; for (File item : subItems) { // 只处理文件夹,跳过文件 if (item.isDirectory()) { String oldName = item.getName(); // 判断文件夹名称是否包含要替换的字符串 if (oldName.contains(oldStr)) { String newName = oldName.replace(oldStr, newStr); File newFolder = new File(targetDirPath + File.separator + newName); // 执行重命名并反馈结果 if (item.renameTo(newFolder)) { System.out.println("已重命名:" + oldName + " -> " + newName); renameCount++; } else { System.err.println("重命名失败:" + oldName); } } } } System.out.println("批量重命名完成,共成功修改 " + renameCount + " 个文件夹"); scanner.close(); } }
代码关键点说明
- 用
File.listFiles()获取目标目录下的所有子文件/文件夹 - 通过
isDirectory()筛选出需要处理的文件夹 - 用
String.replace()替换名称中的指定字符串,生成新的文件夹名 - 调用
renameTo()执行重命名,同时输出成功/失败的反馈
Perl脚本方案
如果你更倾向于用Perl实现,这个脚本同样能完成批量替换需求:
use strict; use warnings; print "请输入包含待重命名文件夹的目录路径:"; my $target_dir = <STDIN>; chomp $target_dir; unless (-d $target_dir) { die "输入的路径不是有效目录!\n"; } print "请输入要替换的旧字符串(比如Folder_is_):"; my $old_str = <STDIN>; chomp $old_str; print "请输入替换后的新字符串(比如Folder_):"; my $new_str = <STDIN>; chomp $new_str; opendir(my $dh, $target_dir) or die "无法打开目录:$!"; # 筛选出目录,排除隐藏文件夹 my @folders = grep { -d "$target_dir/$_" && !/^\./ } readdir($dh); closedir($dh); my $rename_count = 0; foreach my $folder (@folders) { if ($folder =~ /\Q$old_str\E/) { my $new_folder = $folder; $new_folder =~ s/\Q$old_str\E/$new_str/g; if (rename("$target_dir/$folder", "$target_dir/$new_folder")) { print "已重命名:$folder -> $new_folder\n"; $rename_count++; } else { warn "重命名失败:$folder\n"; } } } print "批量重命名完成,共成功修改 $rename_count 个文件夹\n";
使用注意事项
- 确保你拥有目标目录的读写权限
- 重命名前建议先备份文件夹,避免意外情况
- 两种方案都能处理包含特殊字符的文件夹名称
内容的提问来源于stack exchange,提问作者AyrusTerminal
相关产品推荐
相关产品推荐

