使用rsync来清理文件

转发一篇写的特别好的rsync博客大家可以去看一看

此次用rsync解决了一个比较烧脑的问题,代替了shell脚本来做这件事情,本来要写一大堆的脚本,现在一条命令搞定。

场景

  a,b两台服务器

a作为中转服务器,暂时保留一些指定后缀的文件,这些文件的内存占用很大,需要在同步到b服务器后将其删除掉,但是这个同步的事情,因为某些原因是在项目的代码里进行的,由于项目年代久远,且在同步时没有做两边文件完整性的校验,因此需要写一个脚本来清理a服务器上的内存空间,将a服务器上已同步到b服务器上的的文件删除掉,并保留b服务器上的文件

下面为大家贴上命令,注意,命令里面的ip和文件路径要换成你自己的东西

rsync -c --remove-source-files  --exclude-from=rsyncRule.txt -r /your/file/dir -e "ssh -p your_port" root@your_ip:/your_file_dir

解释:

         -c: 改变rsync的校验方式,使用-c该参数后通过判断文件内容的校验和来决定是否进行传输 rsync 默认是以文件的更改日期以及大小是否发生变化来决定是否重新传输,如果发生变化就重传输 
        --remove-source-files: 表示传输完毕后,删除发送方的文件

        --exclude-from 参数指定一个本地文件 里面是需要排除的文件模式,每个模式一行 

        -e "ssh -p your_port" 指定 ssh登录 并指定端口号

        root@your_ip:/your_file_dir :用户名@ip :/b服务器/数据目录

这里为大家贴上rsyncRule.txt的内容

#规则文件撰写方式
# 代表注释 
#- 代表不传输的东西
#+ 代表需要传输的东西

#不传输目录 
- */
#传输指定后缀扩展名的文件这里写成你自己需要传输的文件后缀就可以了
#有多个文件需要传的话,就另起一行继续按格式写就好了
+ *.txt

#禁止传输其他文件
- *

小提示

        可以使用 -nv指令测试一下并将结果打印在终端看一看是否能完成我们的需求  -n 模拟将要执行的操作,不是真的执行,配置-v可以将结果输出到终端方便测试

每天进步一点点,一月进步一大坨。

<think>嗯,用户现在想用rsync命令来生成一个脚本,复制源目录到目标目录,同时排除a和b文件,并且保留文件属性。之前我给的解决方案是使用find和cp命令,但现在用户可能觉得rsync更适合他们的需求,或者他们需要更高效的同步方式。我需要回顾一下rsync的用法,特别是关于排除文件和保留属性的部分。 首先,rsync的常用参数包括-a(归档模式,保留属性),-v(详细信息),-z(压缩传输),--delete(删除目标多余文件)等等。用户需要排除a和b文件,所以应该使用--exclude参数。每个排除项可以单独指定,比如--exclude='a' --exclude='b'。另外,如果用户需要从文件中读取排除列表,可以用--exclude-from,但这里只需要排除两个特定文件,直接写在命令里更简单。 接下来,保留文件属性的问题。-a参数已经包含了很多选项,比如递归复制、保留权限、时间戳、所有者等信息,所以应该足够。不过要确认-a是否包含所有需要的属性,比如特殊权限或者扩展属性。如果有需要,可能需要额外的参数,比如--perms,--executability,或者--xattrs,但一般情况下-a已经足够。 用户可能还关心目录结构是否正确复制,是否排除的是文件而不是目录。在rsync中,排除模式默认是针对文件和目录的,所以如果a和b是文件,直接排除即可。但如果用户想排除的是目录,可能需要不同的处理,不过根据用户的问题,应该是排除文件。 另外,注意源目录的路径写法。如果使用/path/to/source/(带斜线),rsync会复制目录下的内容到目标目录,而不是源目录本身。如果用户希望目标目录中包含源目录的文件夹,可能需要调整路径,比如去掉末尾的斜线,或者在目标路径中明确指定目录名。这里需要根据用户的实际需求来判断,但根据之前用户的问题,他们可能希望保留目录结构,所以源目录带斜线可能更合适。 还有,排除多个文件的时候,是否需要使用引号或者转义符号?在命令行中,如果文件名没有特殊字符,直接写--exclude=a即可,但为了安全起见,用单引号包裹起来更稳妥,尤其是在脚本中。 然后,关于脚本的编写,用户可能需要一个bash脚本,定义源目录和目标目录变量,然后执行rsync命令。同时,可能需要创建目标目录,使用mkdir -p确保存在。不过rsync在目标目录不存在时可能会报错,所以加上mkdir -p是好的做法。 测试部分,用户可能需要验证是否排除了a和b文件,可以使用find命令在目标目录中查找这些文件,应该没有输出。另外,检查文件属性是否保留,比如使用ls -l或者stat命令比较源文件和目标文件的属性。 可能的陷阱包括:rsync的排除模式是否区分大小写,路径是否正确,是否有足够的权限,以及是否处理了隐藏文件rsync默认会包含隐藏文件,所以如果用户需要排除,可能需要额外处理,但根据问题描述,这里不需要。 最后,用户可能想知道rsync相比cp命令的优势,比如增量传输、压缩、网络支持等,但根据问题,只需给出正确的命令即可。</think>### 基于 `rsync` 的解决方案 以下脚本使用 `rsync` 实现精确目录复制,支持**排除特定文件**、**保留完整文件属性**,并通过 `--delete` 保持目录一致性: --- ### 完整脚本代码 ```bash #!/bin/bash # 定义源目录和目标目录(注意末尾斜线) source_dir="/path/to/source/" target_dir="/path/to/target/" # 创建目标目录(如果不存在) mkdir -p "$target_dir" # 执行rsync同步 rsync -avz --delete \ --exclude='a' \ --exclude='b' \ "$source_dir" "$target_dir" ``` --- ### 核心参数解析 1. **`-avz` 组合** - `-a`:归档模式(保留权限、时间戳、符号链接等)[^2] - `-v`:显示操作细节 - `-z`:启用压缩(提升网络传输效率) 2. **`--exclude='a'`** 精确排除所有名为 `a` 或 `b` 的文件(无论位于哪个子目录中)[^1] 3. **`--delete`** 删除目标目录中存在但源目录中已不存在的文件,保持严格同步[^1] 4. **路径斜线规则** - `source_dir/`:同步目录**内容**(生成 `target/file`) - `source_dir`:同步目录**本身**(生成 `target/source/file`) --- ### 进阶功能扩展 #### 排除模式增强 ```bash # 排除特定路径下的文件(如:所有子目录中的a文件--exclude='*/a' # 使用通配符排除类型(如:所有.txt文件--exclude='*.txt' # 从文件加载排除规则 --exclude-from='/path/to/exclude_list.txt' ``` #### 属性深度保留 ```bash # 保留ACL和扩展属性(需root权限) rsync -avzAX --delete ... ``` #### 网络传输优化 ```bash # SSH加密通道传输(替换本地路径为远程地址) rsync -avz -e "ssh -p 22" \ --exclude='a' \ /local/source/ user@remote:/remote/target/ ``` --- ### 验证方法 1. **检查排除文件** ```bash find "$target_dir" -name "a" -o -name "b" # 应无输出 ``` 2. **验证文件属性** ```bash # 对比随机文件的inode信息 ls -li "$source_dir/file" "$target_dir/file" stat "$source_dir/file" "$target_dir/file" ``` 3. **目录一致性校验** ```bash diff -r "$source_dir" "$target_dir" | grep -v "a\|b" ``` --- ### 性能对比 | 特性 | `rsync` 方案 | `find + cp` 方案 | |--------------------|-------------------------------|------------------------------| | 增量更新 | ✅ 仅传输变化部分 | ❌ 全量复制 | | 网络传输 | ✅ 原生支持 | ❌ 需额外工具 | | 属性保留 | ✅ 完整保留 | ✅ 完整保留 | | 删除多余文件 | ✅ `--delete` | ❌ 需手动清理 | | 大文件处理 | ✅ 断点续传 | ❌ 完全重传 | --- ### 注意事项 - **符号链接处理**:`-a` 默认保留符号链接,若需跟随链接用 `-L` 参数[^2] - **权限问题**:同步系统文件时可能需要 `sudo` - **首次同步耗时**:全量同步时 `rsync` 可能略慢于 `cp`,但后续更新极快 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值