如何根据父目录名称批量重命名后缀为.gbk的文件?
实现方案
你可以通过以下两种常见系统环境的脚本实现批量重命名,操作前建议先备份所有目标文件避免误操作。
Linux/macOS 终端方案
方案1:兼容性最高的bash循环(推荐)
首先执行以下命令预览所有即将执行的重命名操作,确认规则匹配正确:
for file in cluster1_bin.*_res/*.gbk; do # 提取文件所属父目录名称 parent_dir=$(basename $(dirname "$file")) # 提取文件名中 .region 及之后的后缀部分 suffix=$(basename "$file" | sed 's/^.*\.region/.region/') # 拼接新的完整文件路径 new_file="$(dirname "$file")/${parent_dir}${suffix}" # 打印待执行命令,确认无误后再执行实际重命名 echo "mv \"$file\" \"$new_file\"" done
确认打印的所有重命名命令符合预期后,将最后一行的echo删除,或者直接在上述命令末尾追加| bash即可执行实际重命名。
如果需要避免同目录下重名文件覆盖,可以使用带重名处理的版本:
for file in cluster1_bin.*_res/*.gbk; do parent_dir=$(basename $(dirname "$file")) suffix=$(basename "$file" | sed 's/^.*\.region/.region/') new_file="$(dirname "$file")/${parent_dir}${suffix}" count=1 # 重名自动追加序号 while [ -f "$new_file" ]; do new_file="$(dirname "$file")/${parent_dir}_${count}${suffix}" count=$((count+1)) done mv "$file" "$new_file" done
方案2:Perl版rename一键命令(适合Debian/Ubuntu等发行版)
如果你的系统预装了Perl版本的rename命令,可直接执行以下命令完成重命名:
rename 's|(cluster1_bin\.\d+_res)/.*\.region|$1/$1.region|' cluster1_bin.*_res/*.gbk
Windows PowerShell 方案
首先执行预览命令确认重命名规则正确:
# 预览所有重命名操作 Get-ChildItem -Path "cluster1_bin.*_res" -Filter "*.gbk" | ForEach-Object { $parent_name = $_.Directory.Name $suffix = $_.Name -replace '^.*\.region', '.region' $new_name = $parent_name + $suffix Write-Host "Rename-Item -Path `"$($_.FullName)`" -NewName `"$new_name`"" }
确认无误后,将最后一行的Write-Host替换为以下内容即可执行实际重命名:
Rename-Item -Path $_.FullName -NewName $new_name -Force
注意事项
- 如果需要处理的目录前缀不是
cluster1_bin,可自行修改脚本中的目录匹配规则,例如要处理所有_res结尾的目录,将cluster1_bin.*_res替换为*_res即可 - 如果你的文件后缀规则不是
.region开头,可自行调整正则匹配规则适配你的场景
内容的提问来源于stack exchange,提问作者Valentin
相关产品推荐
相关产品推荐

