【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 的组合(最灵活但最慢)
相关推荐
可乐ea43 分钟前
智能体记忆该拆成几层:笔记、记忆表示与注入上下文
服务器·数据库·笔记·ai智能体·提示词工程·上下文工程·记忆系统
唐墨1232 小时前
linux kernel 比较数据大小的宏定义
linux·算法
程序开发阿元2 小时前
密码不进工具:一个独立开发者的服务器凭据管理办法
linux·ssh
分布式存储与RustFS5 小时前
群晖 NAS 被 C3RB3R 锁了:本地备份一起被加密,RustFS 对象锁为什么删不掉
运维·云原生·开源·对象存储·分布式存储·s3·性能基准
真好啊又活了一天5 小时前
服务器和虚机配置IPV6
运维·服务器·github
zixu_star5 小时前
定时任务是什么?从日常自动化到 AI 应用,软件如何自动执行任务?
运维·人工智能·自动化
AR-26710-5 小时前
Linux Day33——定时任务+lvm
linux·运维
墨痕诉清风6 小时前
SSRF漏洞实战记录+OSS桶命令执行+MCP漏洞
linux·服务器·数据库
byte轻骑兵6 小时前
实战 4:BlueZ 源码中添加自定义设备过滤规则
linux·物联网·bluez·电脑蓝牙·嵌入式蓝牙
润滑卫士6 小时前
液压系统工作粘度窗口等级选型:泵允许粘度范围与油温-粘度匹配计算
运维