为何cp -r无法通过大括号展开批量复制文件夹?mkdir/rm却可行
为什么
cp -r 5_ {6..10}_报错,而for循环、mkdir/rm可以正常工作? 核心原因是cp命令的参数规则和大括号展开后的命令结构不匹配,具体拆解如下:
1. 大括号展开后的实际命令
cp -r 5_ {6..10}_ 经过bash的大括号展开后,会变成:
cp -r 5_ 6_ 7_ 8_ 9_ 10_
2. cp命令的参数逻辑
cp的语法规则有两种核心场景:
- 单个源 + 单个目标:把源复制为目标(如果目标不存在,会自动创建对应类型的文件/目录;如果目标已存在,会根据类型覆盖或复制到目录内)
- 多个源 + 一个目标:最后一个参数必须是已存在的目录,cp会把所有源复制到这个目录下
上面展开后的命令里,cp会把5_、6_、7_、8_、9_都识别为要复制的源,把10_当作目标,但此时10_还不存在,也不是目录,所以触发报错:cp: target '10_' is not a directory
3. for循环能正常工作的原因
for循环会逐个执行单独的cp命令:
cp -r 5_ 6_ cp -r 5_ 7_ cp -r 5_ 8_ cp -r 5_ 9_ cp -r 5_ 10_
每次都是单个源 + 单个目标的组合,此时cp会自动创建目标目录(因为源是文件夹且加了-r参数),并把5_的内容复制进去,完全符合cp的语法要求。
4. mkdir和rm支持大括号展开的原因
- mkdir的语法本身就支持一次性创建多个目录:
mkdir dir1 dir2 dir3...,展开后的mkdir 6_ 7_ 8_ 9_ 10_正好是批量创建目录的合法命令。 - rm -rf的语法支持一次性删除多个文件/目录:
rm -rf path1 path2...,展开后的命令就是批量删除这些目录,完全符合语法规则。
内容的提问来源于stack exchange,提问作者karan venkatesh
相关产品推荐
相关产品推荐

