类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
相关产品推荐
相关产品推荐

