【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 的组合(最灵活但最慢)
相关推荐
RisunJan1 小时前
Linux命令-rlogin(远程登录)
linux·运维
深圳恒讯1 小时前
菲律宾云服务器与传统VPS的架构差异
运维·服务器·架构
蓝天下的守望者1 小时前
svt_apb_if里的宏定义问题
运维·服务器·数据库
小林ixn1 小时前
从“玩具工具”到“跨语言利器”:MCP 协议实战解析
运维·服务器·网络
小顿的企业观察2 小时前
中企出海战略规划,正在从“走出去”转向“走进去”
大数据·运维·人工智能·产品运营·制造
数智化转型推荐官3 小时前
2026统一身份管理系统五大发展趋势解读
java·运维·微服务
看菜鸡互3 小时前
探索用 SlideML 让大模型生成 PPT 的实验方法
java·运维
2603_954708313 小时前
全维度容错设计,打造微电网安全运行屏障
服务器·网络·数据库·人工智能·分布式·安全
其实防守也摸鱼3 小时前
蓝队相关知识学习(1)---常用堡垒机和服务器
服务器·功能测试·学习·网络安全·网络攻击模型·攻防对抗·蓝队
大飞记Python4 小时前
Linux命令速查手册(测试开发4年实战总结,附PDF)
linux·网络·pdf