如何给多个子目录添加父目录名称作为前缀重命名
批量给子目录添加父目录前缀
问题场景
我有大量目录(比如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
问题原因
你的脚本有两个核心问题:
- 嵌套循环重复遍历
*/,逻辑混乱——外层循环已经在遍历父目录,内层又遍历当前目录的子目录,完全没必要 - 两次
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
相关产品推荐
相关产品推荐

