You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 08:05:59