Linux shell中如何将多个目录分别批量复制到对应目标目录
问题场景
需要通过Shell命令行完成批量目录复制,初始目录结构如下:
Project ├── directory1 │ └── files1 ├── directory2 │ └── files2 └── directory3 └── files3
目标是为每个原目录生成带.copy后缀的副本目录,副本内文件与原目录完全一致,最终结构如下:
Project ├── directory1 │ └── files1 ├── directory2 │ └── files2 ├── directory3 │ └── files3 ├── directory1.copy │ └── files1 ├── directory2.copy │ └── files2 └── directory3.copy └── files3
错误原因
之前执行的命令:
mkdir directory{1..3}.copy cp -r directory{1..3} directory{1..3}.copy
没有达到预期的核心原因有两点:
- Shell的大括号展开会在命令执行前完成,上述
cp命令展开后实际执行的是cp -r directory1 directory2 directory3 directory1.copy directory2.copy directory3.copy cp命令的语法规则为cp [参数] 源路径1 源路径2 ... 目标路径,即传入的所有路径中,只有最后一个会被识别为复制目标,其余全部被识别为待复制源。因此上述展开后的命令会把前5个路径全部作为源,递归复制到最后一个路径directory3.copy中,最终所有文件都堆积在该目录下。
正确实现方案
不需要提前创建.copy后缀的目标目录,直接通过循环逐个执行复制即可,命令如下:
for dir in directory{1..3}; do cp -r "$dir" "$dir.copy" done
- 该命令会遍历
directory1、directory2、directory3三个目录,逐个将源目录完整复制为同名加.copy后缀的新目录 cp -r在目标路径不存在时,会自动创建对应目录,完全匹配文件结构要求- 提前执行
mkdir创建目标目录反而会导致复制结果异常:如果目标目录已存在,cp -r会把源目录嵌套复制到目标目录内部,生成类似directory1.copy/directory1/files1的错误结构
内容的提问来源于stack exchange,提问作者Amirhossein Rafiee
相关产品推荐
相关产品推荐

