如何在Bash中使用数组配合mkdir命令创建子目录?
解决方法
要让mkdir像解析{1..5}一样解析数组,核心是让bash生成父目录和子目录的笛卡尔积路径。以下是两种无需for循环的实现方式:
方法1:使用eval结合逗号分隔的数组元素
bash的大括号扩展{a,b,c}要求元素用逗号分隔,因此先将数组转为逗号连接的字符串,再通过eval重新解析扩展逻辑:
# 定义子目录数组 tru=(1 2 3 4 5) # 将数组元素转为逗号分隔的字符串 sub_dirs=$(IFS=,; echo "${tru[*]}") # 通过eval让bash解析完整的大括号扩展 eval "mkdir -p {20..30}/{$sub_dirs}"
eval会把{20..30}/{$sub_dirs}解析为{20..30}/{1,2,3,4,5},进而展开成所有父目录+子目录的组合路径,和直接用{1..5}的效果完全一致。
方法2:用printf生成所有路径(无eval)
如果不想用eval(避免数组包含特殊字符时的潜在风险),可以用printf结合bash扩展生成所有路径后传递给mkdir:
tru=(1 2 3 4 5) mkdir -p $(printf "%s/%s " $(printf "%s " {20..30} | sed "s/ / ${tru[*]} /g"))
原理是先给每个父目录拼接所有子目录,再展开成完整路径列表。不过这种方式在数组包含空格等特殊字符时可能失效,通用性不如第一种方法。
内容的提问来源于stack exchange,提问作者zapatilla
相关产品推荐
相关产品推荐

