Bash如何实现复制文件夹到所有子目录并按上级目录名重命名
带空格目录的批量操作解决方案
问题根源
你当前脚本执行失败的核心原因有两个:
- 双引号已经可以保证路径中空格的字面含义,你在引号内额外加的
\转义符会被系统识别为路径的一部分,导致无法找到目标文件 for d in */遍历得到的目录名默认自带末尾的/,拼接路径时不需要额外补充斜杠
修复后可直接运行的脚本
#!/bin/bash # 遍历当前目录下所有一级子目录 for d in */; do # 去除目录名末尾的斜杠,方便后续拼接字符串 pure_dirname="${d%/}" # 复制源文件夹到目标子目录,双引号自动兼容路径空格 cp -R ../"Foobar Project" "$d" # 重命名复制得到的文件夹 mv -- "$d/Foobar Project" "$d/${pure_dirname} Project" # 重命名内部的Foobar.file文件 mv -- "$d/${pure_dirname} Project/Foobar.file" "$d/${pure_dirname} Project/${pure_dirname}.file" done
注意事项
执行脚本前建议先做校验:
- 确认当前工作目录为
My Projects,上级目录存在Foobar Project文件夹和内部的Foobar.file- 可以先在
cp和mv命令前加echo试运行,检查输出的路径是否符合预期,确认无误后再去掉echo正式执行- 命令中的
--用于适配目录名以-开头的极端场景,避免系统将目录名识别为命令参数
内容的提问来源于stack exchange,提问作者SynchronDEV
相关产品推荐
相关产品推荐

