Linux复制文件夹实用技巧:如何优雅地排除指定文件(附实战案例)
YGHub·2024-11-14·5·字数:568 字·阅读时间:2 分钟
今天来聊一个在日常开发和运维中经常遇到的问题:如何在Linux中复制文件夹的同时,优雅地排除某些不需要的文件或目录。这个需求在代码部署、数据备份等场景中特别常见。
一、常见应用场景
- 代码部署时排除.git目录
- 项目备份时排除node_modules
- 日志备份时排除临时文件
- 配置文件同步时排除敏感信息
二、基础命令:cp 与 rsync
1. 使用cp命令(较局限)
bash
# 基础语法cp -r source_folder destination_folder
注意:cp命令本身不支持排除功能,需要配合其他命令使用
2. 使用rsync命令(推荐)
2.1 什么是rsync?(rsync命令快速入门)
rsync是一个快速、通用的远程和本地文件复制工具。它有这些特点:
- 支持增量复制
- 可以保持文件属性
- 支持远程同步
- 支持排除文件
- 带宽占用小
2.1 基础语法
bash
# 基础语法rsync -av --exclude='要排除的文件夹' 源目录/ 目标目录/
三、实战案例
1. 部署代码时排除开发文件
bash
# 排除单个目录rsync -av --exclude='.git' ./myproject/ /deploy/myproject/ # 排除多个目录rsync -av --exclude='.git' --exclude='node_modules' --exclude='*.log' ./myproject/ /deploy/myproject/
2. 使用排除文件批量设置
bash
# 创建排除文件cat > exclude.txt << EOF.gitnode_modules*.log.DS_Storetmp/*EOF # 使用排除文件rsync -av --exclude-from='exclude.txt' ./myproject/ /deploy/myproject/
3. 保留目录结构但排除特定文件
bash
# 排除所有.log文件但保留目录结构rsync -av --exclude='*.log' --prune-empty-dirs ./source/ ./destination/
4. 备份项目但排除缓存
bash
# 排除多种缓存文件rsync -av \ --exclude='*/cache/*' \ --exclude='*/tmp/*' \ --exclude='*/logs/*' \ ./project/ ./backup/
四、进阶技巧
1. 使用通配符
bash
# 排除所有隐藏文件和目录rsync -av --exclude='.*/' --exclude='.*' source/ dest/ # 排除特定扩展名rsync -av --exclude='*.tmp' --exclude='*.bak' source/ dest/
2. 查看将要复制的文件(预演)
bash
# 添加 --dry-run 参数rsync -av --dry-run --exclude='node_modules' source/ dest/
3. 保持权限和时间戳
bash
# -a 参数已包含保持权限等功能# --times 保持时间戳rsync -av --times --exclude='.git' source/ dest/
五、常用排除模式
1. 开发环境
bash
# 常用开发文件排除列表.git/.gitignore.envnode_modules/vendor/*.log*.tmp.DS_Store
2. 部署环境
bash
# 部署时的排除列表tests/docs/*.md.github/.gitlab/docker-compose*.yml
六、实用脚本示例
1. 项目部署脚本
bash
#!/bin/bash# deploy.sh SOURCE_DIR="./project"DEST_DIR="/var/www/html" # 创建临时的排除文件cat > exclude.txt << EOF.git/node_modules/tests/*.log.envEOF # 执行同步rsync -av --exclude-from='exclude.txt' "$SOURCE_DIR/" "$DEST_DIR/" # 清理临时文件rm exclude.txt
2. 自动备份脚本
bash
#!/bin/bash# backup.sh BACKUP_DATE=$(date +%Y%m%d)SOURCE_DIR="/var/www/project"BACKUP_DIR="/backup/project_$BACKUP_DATE" rsync -av \ --exclude='*.log' \ --exclude='node_modules' \ --exclude='tmp/*' \ "$SOURCE_DIR/" "$BACKUP_DIR/" # 压缩备份tar -czf "$BACKUP_DIR.tar.gz" "$BACKUP_DIR"
七、注意事项
1.路径末尾的斜杠
- 源路径带斜杠:复制目录内容
- 源路径不带斜杠:复制目录本身
2.权限问题
- 确保有足够的读写权限
- 注意保持文件权限的一致性
3.性能考虑
- 排除大型目录可显著提升速度
- 使用-z参数在网络传输时压缩
4.调试技巧
- 使用–dry-run预览
- 添加-v查看详细信息
希望这篇文章对大家有帮助!
Preview
5
点个赞 ~
版权申明: © 本文著作权归YGHub所有,未经YGHub网授权许可,禁止第三方以任何形式转载和使用本文内容。
Related article
基于微信小程序实现图片压缩、裁剪、尺寸调整的实践总结
YGHub
2025-01-02
4
Vue3 作用域插槽,提升组件复用性的利器
YGHub
2024-12-03
1
Nuxt3 中使用 localStorage 的正确姿势
YGHub
2024-12-01
3
Vue3 子组件 defineExpose 暴露方法无效的三种常见场景及解决方案
YGHub
2024-11-24
7
Vue3 组件通信实战,实现跨组件数据更新
YGHub
2024-11-21
8