Mac Bash将copy-build目录文件复制到build目录并覆盖的方法求助
解决Bash中复制目录内文件而非目录本身的问题
我懂你遇到的麻烦——用cp -r直接复制整个目录时,会把copy-build整个嵌套到build里面,变成build/copy-build/xxx,完全不是你想要的“把文件直接放到build根目录”的效果。别急,下面几个简单的命令就能精准解决这个需求,还能自动覆盖同名文件:
方法1:使用通配符直接复制(最常用)
这个方法用*匹配copy-build里的所有非隐藏文件和子目录,再加上-f强制覆盖(避免交互提示):
cp -rf ./copy-build/* ./build/
如果你的copy-build里有隐藏文件(比如.env、.gitignore这类以.开头的文件),上面的命令不会包含它们。要同时复制隐藏文件,可以先开启Bash的dotglob选项,再执行复制:
shopt -s dotglob cp -rf ./copy-build/* ./build/ shopt -u dotglob # 可选:关闭dotglob,恢复默认行为
或者也可以直接显式匹配隐藏文件(cp会自动忽略.和..这两个特殊目录):
cp -rf ./copy-build/* ./copy-build/.* ./build/
方法2:用rsync实现更灵活的同步
如果需要更强大的文件同步功能(比如自动删除目标目录里源目录没有的文件、保留文件权限等),rsync是更好的选择:
rsync -a --delete ./copy-build/ ./build/
-a:归档模式,包含递归复制、保留文件权限/所有者/时间戳等特性--delete:可选参数,会删除build目录里copy-build中不存在的文件(如果不需要清理目标目录,可以去掉这个参数)- 重点:源目录
./copy-build/结尾的/非常关键,它告诉rsync要复制的是目录内的内容,而不是目录本身。
为什么你之前的命令不行?
你用的cp -r ./copy-build ./build,Bash会把copy-build目录作为一个整体,复制到build目录下,最终形成build/copy-build/的嵌套结构——这就是问题所在。而上面的方法都是直接定位到目录内的内容,所以能把文件直接放到build根目录里。
内容的提问来源于stack exchange,提问作者Paul
相关产品推荐
相关产品推荐

