Logo

Linux复制文件夹实用技巧:如何优雅地排除指定文件(附实战案例)

author
YGHub·2024-11-14·5·字数:568 字·阅读时间:2 分钟

今天来聊一个在日常开发和运维中经常遇到的问题:如何在Linux中复制文件夹的同时,优雅地排除某些不需要的文件或目录。这个需求在代码部署、数据备份等场景中特别常见。

一、常见应用场景

  1. 代码部署时排除.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
.git
node_modules
*.log
.DS_Store
tmp/*
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
.env
node_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
.env
EOF
 
# 执行同步
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网授权许可,禁止第三方以任何形式转载和使用本文内容。