Ubuntu:批量重命名不同目录下的多个文件
一次性批量重命名多目录下的文件方案
当然可以一次性完成所有目录下的文件重命名!你之前的命令只能单目录操作,我们可以通过嵌套循环的Shell脚本实现全自动化批量处理,不用逐个目录手动执行命令。
核心思路
遍历所有目标目录,先提取每个目录的序号(比如Dir1对应序号1,Dir62对应序号62),再在每个目录内按顺序给文件重命名为目录序号_01、目录序号_02的格式。
可直接使用的Shell脚本
#!/bin/bash # 遍历所有以Dir开头的目录(可根据实际目录名修改匹配规则) for dir in Dir*; do # 跳过不是目录的项(防止匹配到文件) [ -d "$dir" ] || continue # 提取目录的数字序号(比如Dir1 → 1,Dir62 → 62) dir_num=$(echo "$dir" | sed 's/Dir//') # 初始化文件计数器,从1开始 file_count=1 # 遍历当前目录下的所有文件(跳过子目录) for file_path in "$dir"/*; do [ -f "$file_path" ] || continue # 格式化计数器为两位数字(1 → 01,10 → 10) formatted_count=$(printf "%02d" "$file_count") # 获取文件原后缀名(保留原格式,如原文件是jpg就保留jpg) file_ext="${file_path##*.}" # 执行重命名操作 mv "$file_path" "$dir/${dir_num}_${formatted_count}.${file_ext}" # 计数器自增 ((file_count++)) done done
脚本关键细节说明
- 目录匹配规则:
Dir*会匹配所有以Dir开头的目录,如果你的目录命名不是这个格式(比如folder_1),可以修改为对应的匹配模式,或者用正则更精准提取序号。 - 序号提取:
sed 's/Dir//'用于移除目录名中的Dir前缀,提取纯数字序号。如果目录名格式不同,比如Folder-05,可以调整为sed 's/Folder-//'。 - 两位数字编号:
printf "%02d"确保编号是两位,满足01、02的格式要求,避免出现1、2的单数字情况。 - 特殊字符兼容:所有变量都用双引号包裹,能正确处理文件名包含空格、特殊符号的情况。
注意事项
- 先备份! 批量重命名前建议复制一份整个目录结构到测试文件夹,先测试脚本,避免误操作导致文件丢失。
- 过滤文件类型:如果只想处理特定类型的文件(比如只重命名
.png),可以把"$dir"/*改成"$dir"/*.png。 - 跳过子目录:脚本中的
[ -f "$file_path" ] || continue会跳过目录下的子目录,只处理普通文件。
内容的提问来源于stack exchange,提问作者Dalveer Singh
相关产品推荐
相关产品推荐

