You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何给多个子目录添加父目录名称作为前缀重命名

批量给子目录添加父目录前缀

问题场景

我有大量目录(比如1111、2222、3333等),每个目录下都有一个名为_apple的子目录。需要把父目录的名称作为前缀,添加到子目录名中。

现有目录结构:

1111
 _apple

2222
 _apple

3333
 _apple

期望的目录结构:

1111
 1111_apple

2222
 2222_apple

3333
 3333_apple

我尝试了下面的脚本,但它只对第一个目录生效,没法遍历所有目录(实际有100+个目录):

for folder in */; do 
    
    for sample_num in */; do
        cd $sample_num
        sample="${sample_num::-1}"
        for rename in _apple; do
            mv -- "$rename" "{$sample}_{$rename}"
        done
        cd ..
        cd ..
    done

问题原因

你的脚本有两个核心问题:

  1. 嵌套循环重复遍历*/,逻辑混乱——外层循环已经在遍历父目录,内层又遍历当前目录的子目录,完全没必要
  2. 两次cd ..会直接跳出到初始目录的上层,后续循环执行时路径已经错误,自然无法处理其他目录

修复方案

方案1:不切换目录,直接用路径处理(最稳妥)

单个循环遍历所有父目录,通过路径拼接完成重命名,无需切换目录:

for parent_dir in */; do
    # 去掉目录名末尾的斜杠
    parent_name="${parent_dir%/}"
    # 拼接原路径和目标路径
    old_subdir="${parent_dir}_apple"
    new_subdir="${parent_dir}${parent_name}_apple"
    # 执行重命名,--避免目录名以-开头被当成命令选项
    mv -- "$old_subdir" "$new_subdir"
done

方案2:用pushd/popd安全切换目录

如果习惯用cd操作,用pushd和popd保证目录切换后能回到原位置,避免路径混乱:

for parent_dir in */; do
    parent_name="${parent_dir%/}"
    # 进入父目录,失败则跳过
    pushd "$parent_dir" || continue
    # 重命名子目录
    mv -- "_apple" "${parent_name}_apple"
    # 返回原目录
    popd
done

补充说明

  • ${parent_dir%/}是比${sample_num::-1}更通用的去除末尾斜杠的写法,兼容更多Shell环境
  • 两个方案都能稳定遍历所有父目录,处理100+个目录毫无压力

内容的提问来源于stack exchange,提问作者Nayab Qureshi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.17 13:17:21