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

类Unix系统下如何复制指定扩展名文件并保留原目录结构?

解决src目录HTML文件带目录结构复制到dist的问题

嘿,我来帮你搞定这个文件复制的问题!你遇到的核心问题其实是bash对**的匹配规则,以及cp命令保留目录结构的正确用法,咱们一步步来解决:

首先,替换掉繁琐的目录判断命令

你之前用[ -d _dist/ ] || mkdir _dist/来创建目录,其实可以用更简洁且健壮的命令:

mkdir -p _dist/

-p参数的好处是:如果_dist已经存在,不会报错;如果需要创建多级父目录(比如_dist/sub),也会自动帮你建好,完全替代了手动判断的逻辑。

正确的文件复制命令(保留目录结构)

要把_src下所有HTML文件(包括子目录里的)复制到_dist且保留原结构,关键要用cp的--parents参数,再配合正确的递归匹配:

步骤1:确保bash支持**递归匹配(bash用户必看)

bash默认是关闭globstar选项的,这会导致**只能匹配当前目录的文件,无法递归子目录。临时开启的命令是:

shopt -s globstar

如果想永久生效,可以把这个命令加到你的~/.bashrc或者~/.bash_profile文件里。

步骤2:执行复制命令

开启globstar后,直接运行:

cp --parents _src/**/*.html _dist/

--parents参数会让cp保留源文件相对于_src的路径,这样子目录里的HTML文件会自动在_dist里创建对应的目录结构。

合并成一条命令

把创建目录和复制合并成一行,就是:

mkdir -p _dist/ && shopt -s globstar && cp --parents _src/**/*.html _dist/

为什么你之前的命令不好用?

  • 用cp -R _src/**/*.html _dist/时:如果没开globstar,**和*没区别,只能复制_src根目录的HTML文件;即使开了,-R是用来递归复制目录的,对单个文件来说没必要,反而可能因为匹配到目录出现意外。
  • 去掉**用cp -R _src/*.html _dist/:只会复制_src根目录的HTML文件,完全不会处理子目录里的内容。

举个例子验证

假设你的_src结构是这样的:

_src/
├── index.html
├── about/
│   └── info.html
└── blog/
    ├── post1.html
    └── post2.html

执行完命令后,_dist的结构会和_src里的HTML文件结构完全一致:

_dist/
├── index.html
├── about/
│   └── info.html
└── blog/
    ├── post1.html
    └── post2.html

内容的提问来源于stack exchange,提问作者Vera Perrone

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 04:12:12