rsync增量同步文件用法实践

rsync

rsync: remote sync,远程同步,用于在本地机器及远程机器之间同步数据。

对于本地机器之内,同步数据使用cp即可。
对于本地与远程,使用scp即可。

但上面两个命令同步数据时一般是无脑覆盖文件,而rsync则不会直接覆盖以前的数据(如果数据已经存在),而是先判断已经存在的数据和新数据的差异,只有数据不同时才会把不相同的部分覆盖。

怎么判定文件有改动呢?默认是检查文件大小和最后修改时间是否一致,如果一致则认为无变动,不会传输该文件,如果不一致则同步。

对于想让两台机器某个目录一致的需求来说,如果目录每天新增数据,则相对scp来说,可以节省大量带宽。

因为它用少量的文件信息换取了大量文件内容的传输。

常用参数

以本地同步文件为例,远程同步只需要在本地同步的基础上加上远程主机的前缀即可,见下文介绍。

初次使用rsync可能会有些疑惑,有时想同步文件夹,却被新创建的目录迷惑,如下:

rsync -r a b

-r参数表示递归目录,与cp中一致。如果不加-r,不会同步任何东西:skipping directory a。

想要把a目录下所有文件同步到b目录下,结果却把a连同目录同步到了b:

% tree
.
└── a
    └── a.csv

1 directory, 1 file

% rsync -rv a b
sending incremental file list
created directory b
a/
a/a.csv

sent 125 bytes  received 63 bytes  376.00 bytes/sec
total size is 4  speedup is 0.02

% tree
.
├── a
│   └── a.csv
└── b
    └── a
        └── a.csv

3 directories, 2 files

其中:

  • -v表示显示详细信息
  • 如果目标目录不存在,则创建
  • 同步时连同目录a一块同步了
  • 最后生成了b/a/a.csv的目录结构

想要达到目的也简单,只需要在目录上加后缀即可:

% rm -rf b
% rsync -rv a/ b
sending incremental file list
created directory b
./
a.csv

sent 115 bytes  received 62 bytes  354.00 bytes/sec
total size is 4  speedup is 0.02

% tree
.
├── a
│   └── a.csv
└── b
    └── a.csv

2 directories, 2 files

可见,在源目录后加目录后缀,就会只传输目录内文件,不会带目录传输了。

最常用的参数是-a,它包含了-r的含义,并保持文件所有属性,包括软链接、文件权限、属主信息、修改时间等等。

总之一句话,以后同步不要用-r了,-a即可搞定一切。

其他常用参数:

  • –delete:删除只存在于目标目录、不存在于源目录的文件,默认只保证源目录的内容传输到了目标目录,而不管目标目录内其他文件
  • –exclude:同步时排除某些文件或目录,如 rsync -av --exclude=‘*.txt’ a/ b,不同步所有以txt结尾的文件
  • –include:指定需要同步的文件,经常与–exclude组合使用,如 rsync -av --include=".txt" --exclude='’ a/ b,只同步以txt结尾的文件
  • -z:同步时压缩数据
增量传输

rsync是增量传输,来具体看看传输过程:

# 有一个22Bytes的文件
% ls -l a
total 4
-rw-r--r-- 1 ysj user 22 May 12 18:32 a.csv

# 传输
% rsync -av a/ b
sending incremental file list
created directory b
./
a.csv

sent 144 bytes  received 62 bytes  412.00 bytes/sec
total size is 22  speedup is 0.11

# 目标文件已经存在,且文件无修改,再次传输
% rsync -av a/ b
sending incremental file list

sent 72 bytes  received 12 bytes  168.00 bytes/sec
total size is 22  speedup is 0.26

# 修改文件内容,加一个Bytes
% ls -l a
total 4
-rw-r--r-- 1 ysj user 23 May 12 18:40 a.csv

# 再次传输
% rsync -av a/ b
sending incremental file list
./
a.csv

sent 148 bytes  received 38 bytes  372.00 bytes/sec
total size is 23  speedup is 0.12

# 在源目录新增文件,再传输
% echo 'abc' > a/b.csv
% rsync -av a/ b
sending incremental file list
./
b.csv

sent 150 bytes  received 38 bytes  376.00 bytes/sec
total size is 27  speedup is 0.14

# 无修改再次传输
% rsync -av a/ b
sending incremental file list

sent 96 bytes  received 12 bytes  216.00 bytes/sec
total size is 27  speedup is 0.25

总结如下:

  • 每次都会传输数据,即使目标目录与源目录相同,传输的应该是文件的属性,包括文件名、修改时间等
  • 目标目录与源目录相同时,不会传输文件
  • 如果文件被修改,则会被传输
  • 如果有新增文件,则新增文件会被传输
远程传输

与scp一样,只需要加上远程主机标识,如把本地a目录内容传输到远程主机:

rsync -av a/ user@192.168.1.2:/home/user/b

# 反过来,远程传输到本地
rsync -av user@192.168.1.2:/home/user/a/ b
小节

使用rsync可以替代大部分scp的应用场景。

但rsync的因为需要对比文件是否一致,传输时带宽的利用率不如scp。

scp是不管三七直接猛传,可以把带宽打满。所以对于较大的文件,第一次传输时可以用scp省时间。

参数的话,用-a就行了,传目录还是传文件,写清楚就ok了。

  • 4
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 可以使用rsync命令实现本地文件与服务器文件同步rsync命令可以将本地文件复制到远程服务器,也可以将远程服务器的文件复制到本地。它可以使用SSH协议进行加密传输,还支持增量同步,只传输修改过的文件。 以下是一个示例脚本,可以将本地的文件同步到远程服务器上: ```bash #!/bin/bash # 本地文件夹路径 local_dir="/path/to/local/directory" # 远程服务器信息 remote_host="remote_host" remote_user="remote_user" remote_dir="/path/to/remote/directory" # 使用rsync命令同步文件 rsync -avz --delete -e ssh $local_dir/ $remote_user@$remote_host:$remote_dir/ ``` 在这个脚本中,我们首先定义了本地文件夹的路径和远程服务器的信息。然后使用rsync命令将本地文件同步到远程服务器上。其中,-a选项表示使用归档模式同步文件,-v选项表示输出详细信息,-z选项表示使用压缩传输数据,--delete选项表示删除远程服务器上不存在的文件,-e ssh选项表示使用SSH协议进行加密传输。最后,我们将本地文件夹的路径和远程服务器的信息传递给rsync命令。 你可以将此脚本保存为一个.sh文件,然后在终端中执行它来同步文件。请注意替换本地文件夹路径和远程服务器信息为你自己的信息。 ### 回答2: 要实现本地文件与服务器文件同步,可以使用shell脚本来完成。 首先,需要确定同步的目录路径,包括本地和服务器的路径。 然后,可以使用rsync命令来进行文件同步。可以通过命令rsync -avz(-a表示归档模式,保留文件属性,-v表示显示详细信息,-z表示压缩传输)来同步文件。 例如,要将本地目录/path/to/local同步到服务器的目录/path/to/server,可以使用以下脚本实现: #!/bin/bash local_dir="/path/to/local" server_dir="user@server:/path/to/server" rsync -avz $local_dir $server_dir 将以上脚本保存为sync.sh文件,并给予执行权限(chmod +x sync.sh)。 然后,在终端中执行./sync.sh即可开始文件同步。 注意,需要正确配置服务器的连接信息,并确保本地和服务器的目录路径正确。 另外,可以根据实际需求添加其他参数,比如排除某些文件或目录、设置带宽限制等。 总结起来,使用shell脚本实现本地文件与服务器文件同步的步骤如下: 1. 确定同步的目录路径; 2. 编写脚本,使用rsync命令进行文件同步; 3. 配置服务器的连接信息并确保目录路径正确; 4. 执行脚本开始文件同步。 这样,就可以实现本地文件与服务器文件同步了。 ### 回答3: 实现本地文件与服务器文件同步的一种常见方法是使用shell脚本结合rsync命令。rsync是一个优秀的文件传输和同步工具,它可以帮助我们在本地文件和远程服务器文件之间实现快速、高效的同步。 首先,我们需要先安装rsync命令。在Linux系统中,可以使用包管理器直接安装,例如使用apt-get命令安装: ``` sudo apt-get install rsync ``` 接下来,我们需要编写一个shell脚本,用于实现同步功能。以下是一个简单的示例脚本: ```shell #!/bin/bash # 本地文件夹路径 local_dir="/path/to/local" # 服务器地址 server="username@remote_server:/path/to/server" # rsync命令实现同步 rsync -avz --delete $local_dir $server echo "同步完成。" ``` 在上述脚本中,我们需要设置本地文件夹路径和服务器地址。其中,`$local_dir`为本地文件夹路径,例如`/home/user/sync_folder`;`$server`为服务器地址,例如`username@remote_server:/home/user/sync_folder`。 rsync命令的选项说明: - `-a`:归档模式,保持文件属性、权限等; - `-v`:显示详细输出; - `-z`:使用压缩传输; - `--delete`:删除服务器上与本地文件夹不匹配的文件。 在脚本的最后,我们使用`echo`命令输出同步完成的提示信息。 保存脚本文件,并设置执行权限: ``` chmod +x sync.sh ``` 最后,只需执行该脚本,即可实现本地文件与服务器文件同步: ``` ./sync.sh ``` 这样,每次执行脚本时,将会自动同步本地文件夹和远程服务器上的文件,确保它们保持同步
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值