【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 的组合(最灵活但最慢)
相关推荐
浮尘笔记18 小时前
Java Snowy框架CI/CD云效自动化部署流程
java·运维·服务器·阿里云·ci/cd·自动化
测试修炼手册1 天前
[测试工具] 用 Codex 做测试实战:从需求分析到自动化用例落地
运维·自动化·需求分析
米高梅狮子1 天前
03.网络类服务实践
linux·运维·服务器·网络·kubernetes·centos·openstack
June`1 天前
网络编程时内核究竟做了什么???
linux·服务器·网络
原来是猿1 天前
腾讯云服务器端口开放完全指南
服务器·网络·腾讯云
你的保护色1 天前
【无标题】
java·服务器·网络
楼兰公子1 天前
RK3588 + Linux7.0.3 网络工程调试错误速查手册
linux·网络·3588
Elnaij1 天前
Linux系统与系统编程(9)——自设计shell与基础IO
linux·服务器
IpdataCloud1 天前
稳定的企业级IP数据接口怎么选?可用性指标+离线库高可用方案
运维·网络·tcp/ip
WebGIS开发1 天前
地信职业百科②:GIS运维
运维·gis·就业·转行