mv src/* ./ 移动文件后还有两个.开头的文件没有移动?
原因
bash 的 * 通配符默认不会匹配 .开头隐藏文件(.git、.env、.gitignore),所以 mv src/* ./ 只会移普通文件,隐藏文件留在src目录里面。
千万不要写mv src/.* ./,.*会匹配.和..,会把当前、上级目录也移动,直接炸锅。
方案1(Bash,最稳妥,推荐,composer临时目录迁移场景)
#开启dotglob,让*包含隐藏文件,不包含 . 和 ..
shopt -s dotglob
mv src/* ./
#关闭dotglob,恢复shell默认行为
shopt -u dotglob执行完,src里面所有(含.git、.env)全部移动到当前目录。
方案2 不修改shell选项,直接写模式
mv src/* src/.[!.]* ./ 2>/dev/null2>/dev/null 抑制“没有匹配到隐藏文件”的报错。
方案3 find(跨shell通用,脚本里优先用)
find src -mindepth 1 -maxdepth 1 -exec mv {} ./ \;‑mindepth 1跳过src本身,所有子项(普通+隐藏)全部移动出来,zsh/bash都兼容,不会踩通配符坑。
你刚才composer场景完整实操示例
composer create-project topthink/think temp_proj
cd temp_proj
#把temp_proj里面全部内容(含.git .env)移动到上一级
shopt -s dotglob
mv * ../
shopt -u dotglob
cd ..
rm -rf temp_proj校验是否全部迁移完成
ls -la查看是否存在 .git .env 这类点开头文件。
重要提醒:移动前建议先 ls -la src 预览一遍,确认要移动的文件列表,避免误操作覆盖本地已有文件。版权属于:Joyber
本文链接:https://blog.qqvbc.com/default/1523.html
转载时须注明出处及本声明