如何修改Terminal批量重命名脚本以处理一级子文件夹内的文件?
修改后的脚本方案
方案1:沿用原sed逻辑,遍历一级子目录处理图片
# 遍历当前父目录下的所有一级子文件夹 for dir in */; do # 进入子文件夹,进入失败则跳过 cd "$dir" || continue # 只处理jpg格式图片,可按需扩展其他格式 for file in *.jpg; do # 跳过不存在的文件(避免匹配不到文件时处理"*.jpg"字符串) [[ -f "$file" ]] || continue # 检查文件名是否包含下划线 if [[ "$file" == *"_"* ]]; then # 提取首个下划线后的内容作为新文件名 new_name=$(echo "$file" | sed 's/^[^_]*_//') # 执行重命名 mv "$file" "$new_name" fi done # 返回父目录 cd .. done
方案2:用bash参数展开优化(无需调用sed,更高效)
利用bash原生的参数展开功能,省去外部sed命令的调用,执行效率更高:
for dir in */; do cd "$dir" || continue for file in *.jpg; do [[ -f "$file" ]] || continue if [[ "$file" == *"_"* ]]; then # ${file#*_} 表示删除从开头到第一个下划线(含下划线)的部分 new_name="${file#*_}" mv "$file" "$new_name" fi done cd .. done
关键修改说明
- 外层循环
for dir in */:专门匹配当前目录下的所有一级子文件夹,仅处理一级目录符合需求 cd "$dir" || continue:容错处理,避免因权限或目录异常导致后续命令出错- 内层循环限定为
*.jpg:只处理图片文件,防止误改子文件夹内的非图片文件,可扩展为*.{jpg,jpeg,png,gif}覆盖更多常见图片格式 [[ -f "$file" ]] || continue:避免子文件夹内无对应格式文件时,脚本把通配符字符串当作文件名处理
内容的提问来源于stack exchange,提问作者Tony
相关产品推荐
相关产品推荐

