如何使用ls与管道结合mkdir在另一根目录创建同名子目录
批量复制目录结构的Shell解决方案
嘿,这个需求其实挺常见的,用Shell命令组合就能轻松实现,我给你几个靠谱的方案,你可以根据自己的习惯选:
方案一:ls + sed + xargs 组合
这个是比较直观的管道用法,先列出目标目录,替换路径前缀后批量创建:ls -d AAA/*/ | sed 's/AAA/BBB/' | xargs mkdir -p各部分作用:
ls -d AAA/*/:只列出AAA下的直接子目录(末尾的/确保只选目录,不会包含文件)sed 's/AAA/BBB/':把路径里的AAA替换成BBB,得到我们要创建的目标路径xargs mkdir -p:把处理后的路径批量传给mkdir,-p参数会自动创建不存在的父目录(比如BBB本身如果还没创建的话也会一起生成)
方案二:find 命令(更安全,适配特殊目录名)
如果你的目录名可能包含空格、特殊字符,find命令会比ls更可靠:find AAA -mindepth 1 -maxdepth 1 -type d -printf "BBB/%f\n" | xargs mkdir -p各部分作用:
-mindepth 1 -maxdepth 1:只找AAA下的直接子目录,不会递归也不会包含AAA本身-type d:只筛选目录类型-printf "BBB/%f\n":输出格式化为BBB/目录名,%f表示只取目录的basename(去掉前面的AAA/)
方案三:纯Bash循环(无需管道,可读性强)
如果你不想用管道,用Bash的内置循环也能搞定,逻辑更清晰:for dir in AAA/*/; do mkdir -p "BBB/${dir#AAA/}"; done这里的
${dir#AAA/}是Bash的参数展开语法,作用是去掉dir变量里开头的AAA/前缀,剩下的就是子目录名,再拼上BBB/就是目标路径。
小提示
不管用哪个方案,mkdir -p都是关键参数——它会忽略已存在的目录,不会抛出错误,所以即使BBB已经有部分子目录也不用担心。
内容的提问来源于stack exchange,提问作者hrsma2i
相关产品推荐
相关产品推荐

