【Linux】如何拷贝目录?

在 Ubuntu(Linux)下,原生的 cp 命令本身没有方便的 --exclude 选项 ,要排除特定子目录,最常用且最推荐的做法是使用 rsync(几乎所有 Ubuntu 系统都预装了)。

假设你要:

  • 源目录:./src/
  • 目标目录:./dst/
  • 要排除的两个子目录:node_modules 和 .git

推荐写法(最常用、最清晰)

bash 复制代码
# 方式1:推荐(使用相对路径排除)
rsync -a -i --exclude=node_modules --exclude=.git ./src/ ./dst/

# 方式2:更明确的写法(推荐在脚本中使用)
rsync -ai \
  --exclude='node_modules' \
  --exclude='.git' \
  ./src/ ./dst/

# 方式3:如果排除的目录比较多,可以用排除文件
cat > exclude.txt << 'EOF'
node_modules/
.git/
EOF

rsync -ai --exclude-from=exclude.txt ./src/ ./dst/

参数说明

选项 含义
-a 归档模式(保留权限、时间、符号链接等)≈ -rlptgoD
-i / --itemize-changes 显示哪些文件被拷贝(类似你用的 -r 时的交互感,但更详细)
--exclude 排除匹配的路径(从源目录算起的相对路径)
末尾的 / 非常重要!表示拷贝 src 目录里面的内容,而不是拷贝 src 这个目录本身

如果你非常坚持只用 cp(不推荐)

方法一:使用 bash 的 extglob(比较麻烦)

bash 复制代码
# 先开启 extglob 功能
shopt -s extglob

# 拷贝所有东西,除了 node_modules 和 .git 两个目录
cp -air ./src/!(node_modules|.git) ./dst/

方法二:使用 find + cp(更可靠但更慢)

bash 复制代码
find ./src/ \
  -mindepth 1 \
  -not -path "./src/node_modules/*" \
  -not -path "./src/.git/*" \
  -not -name node_modules \
  -not -name .git \
  -exec cp -air {} ./dst/ \;

总结推荐顺序(从好到差):

  1. rsync -ai --exclude=xxx --exclude=yyy src/ dst/ ← 最推荐
  2. rsync -ai --exclude-from=exclude.txt src/ dst/
  3. bash extglob 的 cp -air src/!(dir1|dir2) dst/
  4. find + cp 的组合(最灵活但最慢)
相关推荐
程序员-Benothing8 小时前
Linux安全加固指南:账号、权限、服务、审计基线
linux·运维·安全
Mininglamp_27189 小时前
接口调用 vs 屏幕理解:两种 GUI 自动化架构的技术取舍
运维·架构·自动化
Cry丶9 小时前
ubuntu安装vsftpd
服务器·网络·ubuntu
爱喝水的鱼丶11 小时前
SAP-ABAP:ECC→S/4HANA ABAP 迁移升级指南——程序改造、语法兼容与性能优化 导语
运维·开发语言·性能优化·sap·abap·经验交流·开发交流
木子欢儿11 小时前
openconnect Linux客户端安装 以及开机自启和登录
linux·运维·服务器
..Dauntless..12 小时前
【Linux】文件系统(一)
linux·运维·服务器
天空属于哈夫克312 小时前
企业微信API二次开发 赋能私域运营自动化
运维·自动化·企业微信
天远API12 小时前
零信任架构实战:基于天远运营商二要素V即时版构建自动化分时租赁出行会员身份一致性审核网关
运维·人工智能·架构·自动化
九零HTTP12 小时前
10月21号-CSDN配菜-IP池的5个坑
服务器·数据库·tcp/ip
SHENGWEI胜为12 小时前
交换机端口显示正常,终端却获取不到 IP 地址?从 DHCP 流程定位故障
服务器·网络·测试工具·缓存·通信工程