Rsync 是一个用于同步文件的工具。它可以在本地计算机与远程计算机之间,或者两个本地目录之间同步文件。它支持断点续传、增量同步,广泛用于使用网络迁移大量文件;另外,在内置硬盘和外置硬盘之间数据迁移的场景下,它可以替代 cp
和 mv
命令。
它会检查发送方和接收方已有的文件,仅传输有变动的部分(默认规则是文件大小或修改时间有变动)。
官网: rsync
GitHub: RsyncProject/rsync: An open source utility that provides fast incremental file transfer. It also has useful features for backup and restore operations among many other use cases.
安装
发送和接收的两台服务器都需要安装 rsync
sudo apt install -y rsync
使用
本地之间同步
rsync -a source destination
目标目录 destination 如果不存在,rsync 会自动创建。如上同步后的目录结构是 destination/source
,如果只想同步源目录source
里面的内容到目标目录destination
,则需要在源目录后面加上斜杠: rsync -a source/ destination
。
多个文件或目录需要同步: rsync -a source1 source2 destination
。
本地和远程服务器直接同步
# 将本地内容同步到远程服务器
rsync -a source vfly2@1.2.3.4:destination
# 将远程内容同步到本地
rsync -a vfly2@1.2.3.4:source destination
常用参数说明:
-
-r
:对子目录以递归模式处理,本地单次复制可以用这个。 -
-a
:可以替代-r
,同步场景用。除了可以递归同步以外,还可以同步元信息,等价于 -rlptgoD 。 -
--delete
,默认情况下,rsync 只确保源目录的所有内容都复制到目标目录,而不会删除文件。此选项是让两个目录保持相同。 -
-u
:只进行更新,防止本地新文件被重写,注意两者机器的时钟要同时 -
-P
:等同于 –partial –progress
–partial:断点续传。保留那些因故没有完全传输的文件,以是加快随后的再次传输
–progress:在传输过程中显示进度 -
-z
:在传输过程中进行压缩,网络传输时有用 -
-n
或--dry-run
,模拟执行,加上 -v 查看结果。 -
-v
:打印详情 -
-h
:以人类可读显示文件大小和速率
排除文件:
--exclude
排除目标,可多次使用,或者用--exclude={'file1.txt','dir1/*'}
- 排除了所有 TXT 文件
--exclude='*.txt'
- 排除某个目录里面的所有文件,但不希望排除目录本身
--exclude 'dir1/*'
- 如果排除模式很多,可以将它们写入一个文件,每个模式一行,然后用
--exclude-from
参数指定这个文件
- 排除了所有 TXT 文件
--include
用来指定必须同步的文件模式,往往与–exclude结合使用。排除所有文件,但是会包括 TXT 文件--include="*.txt" --exclude='*'
例子
rsync 断点续传方式拷贝本地文件或远程文件,目录下会生成一个隐藏的临时文件,ls -a 可以看到,因此每次中断后,下次能续传拷贝。
SSH 传输
本地文件以断点续传的方式拷贝到远程服务器
rsync -avzhP ./a.tar.gz vfly2@1.2.3.4:/home/vfly2/
远程文件以断点续传的方式拷贝到本地
rsync -avzhP vfly2@1.2.3.4:/home/vfly2/a.tar.gz ./
如果 ssh 命令有附加的参数,可以使用 -e
参数指定要执行的 SSH 命令
rsync -avzhP -e 'ssh -p 2234' source/ user@remote_host:/destination
本地拷贝
不显示进度,适合用在自动脚本中
rsync -a backup.tar.gz /tmp/backups/
本地 usb 文件以断点续传的方式拷贝到本地目录
rsync -avhP /home/vfly2/udisk/keepbit /home/vfly2/qbittorrent/
无密码使用
通过 ssh 远程同步时需要输入密码,使用 ssh 证书登录无需输入密码
在本地生成 SSH 密钥对
这会生成一个密钥对,通常存储在 ~/.ssh/id_rsa
(私钥)和 ~/.ssh/id_rsa.pub
(公钥)中。
ssh-keygen -t rsa -b 4096
将公钥复制到远程服务器:
ssh-copy-id -i ~/.ssh/id_rsa.pub -p 22 vfly2@1.2.3.4
验证无密码登录:
ssh -p 22 vfly2@1.2.3.4
重新运行 rsync
命令:
rsync -avzhP -e "ssh -p 22" vfly2@1.2.3.4:/home/vfly2/mmp/movie/'The Motorcycle Diaries (2004)' /home/vfly2/mmp/movie/
后台传输
上面运行后,终端不能关闭,否则传输也就终止了,当执行耗时的任务时,就很不方便。
下面将任务挪至后台,就不必受此限制,但是不好输入密码,因此必须先配置证书通过无密码登录。要改的地方有两点:
- 在开头加上
nohup
- 在结尾加上
> ~/rsync_movie.log 2>&1 &
- 如果要查看任务进度,使用
tail -f ~/rsync_movie.log
即可,任务执行完会自动结束进程,无须关心
nohup rsync -rvzhP vfly2@1.2.3.4:/home/vfly2/mmp/movie/'The Motorcycle Diaries (2004)' /home/vfly2/mmp/movie/ > ~/rsync_movie.log 2>&1 &
方便服务器传输使用
我习惯在远程服务器上用 PT 下载,然后再把有用的传回家里的服务器上,但是每次都需要组装一个 rsync -rvzhP ...
这样的命令也挺麻烦,所以想到用 sh 函数简化操作。
下面的脚本,用于从 ck 这个服务器下载指定的内容到本地的当前目录下,使用时只需要填一个路径就行,完全不需要打开笔记查看命令使用方法,降低心智负担:
rcp_from_ck "/home/vfly2/mmp/movie/The Motorcycle Diaries (2004)"
上面是在前台运行,如果需要后台运行,增加第二个参数 b 即可
rcp_from_ck "/home/vfly2/mmp/movie/The Motorcycle Diaries (2004)" b
下面是函数的内容,修改三个变量,如果有多个服务器,就复制多个函数
rcp_from_ck() {
local remote_user="vfly2"
local remote_ip="1.2.3.4"
local remote_port=22
echo "rsync -rvzhP -e \"ssh -p ${remote_port}\" ${remote_user}@${remote_ip}:\"${1}\" ./"
read -p "Please check the command [Y/n] " answer
# 设置默认值并转换为小写
answer=${answer:-y}
answer=$(echo "$answer" | tr '[:upper:]' '[:lower:]')
if [[ $answer != "y" ]]; then
return
fi
if [[ ${2} == "b" ]]; then
nohup rsync -rvzhP -e "ssh -p ${remote_port}" ${remote_user}@${remote_ip}:"${1}" ./ > ~/rsync_movie.log 2>&1 &
else
rsync -rvzhP -e "ssh -p ${remote_port}" ${remote_user}@${remote_ip}:"${1}" ./
fi
}
代理
SOCKS 代理
rsync -avzP -e 'ssh -p 22 -o "ProxyCommand=nc -x 127.0.0.1:10808 %h %p"' vfly2@1.2.3.4:/mnt/share/ /home/vfly2/public/
配置项
帮助用
-
-n
或--dry-run
模拟将要执行的操作,而并不真的执行。配合-v
参数使用,可以看到哪些内容会被同步过去。 -
-h
与其他参数共同使用时,表示以人类可读的格式输出。 -
-h
、--help
返回帮助信息。 -
-v
表示输出细节。-vv
表示输出更详细的信息,-vvv
表示输出最详细的信息。 -
--version
返回版本。 -
-i
表示输出源目录与目标目录之间文件差异的详细情况。 -
传输效果
-
-a
、--archive
表示存档模式,保存所有的元数据,比如修改时间(modification time)、权限、所有者等,并且软链接也会同步过去。 -
-r
表示递归,即包含子目录。 -
-P
是--progress
和--partial
这两个参数的结合。--progress
表示显示进展。--partial
允许恢复中断的传输。不使用该参数时,会删除传输到一半被打断的文件;使用该参数后,传输到一半的文件也会同步到目标目录,下次同步时再恢复中断的传输。
-
--bwlimit
指定带宽限制,默认单位是 KB/s,比如--bwlimit=100
。 -
--max-size
设置传输的最大文件的大小限制,比如不超过200KB(--max-size='200k'
)。 -
--min-size
设置传输的最小文件的大小限制,比如不小于10KB(--min-size=10k
)。 -
-z
指定同步时压缩数据。 -
限制传输的文件和目录
-
--exclude
指定排除不进行同步的文件,比如--exclude="*.iso"
。 -
--exclude-from
指定一个本地文件,里面是需要排除的文件模式,每个模式一行。 -
--include
指定同步时要包括的文件,一般与--exclude
结合使用。 -
--existing
、--ignore-non-existing
表示不同步目标目录中不存在的文件和目录。 -
--ignore-existing
表示只要该文件在目标目录中已经存在,就跳过去,不再同步这些文件。 -
-u
、--update
表示同步时跳过目标目录中修改时间更新的文件,即不同步这些有更新的时间戳的文件。 -
-m
指定不同步空目录。 -
--size-only
表示只同步大小有变化的文件,不考虑文件修改时间的差异。 -
-c
、--checksum
改变校验方式。默认情况下,只检查文件的大小和最后修改日期是否发生变化,如果发生变化,就重新传输;使用这个参数以后,则通过判断文件内容的校验和,决定是否重新传输。 -
--link-dest
指定增量备份的基准目录。 -
涉及自动删除
-
--delete
删除只存在于目标目录、不存在于源目标的文件,即保证目标目录是源目标的镜像。 -
--remove-source-files
表示传输成功后,删除发送方的文件。 -
-b
、--backup
指定在删除或更新目标目录已经存在的文件时,将该文件更名后进行备份,默认行为是删除。更名规则是添加由--suffix
指定的文件后缀名,默认是~
。 -
--backup-dir
指定文件备份时存放的目录,比如--backup-dir=/path/to/backups
。 -
--suffix
指定文件名备份时,对文件名添加的后缀,默认是~
。 -
其他
-
-e
指定使用 SSH 协议传输数据。 -
-P 和 –append 区别
-
参数
-P
是标准的断点续传逻辑,适合大多数文件传输(例如大文件、未修改的静态文件)。rsync 会检查目标文件的大小,如果目标文件比源文件小,则从差异位置续传。 -
参数
--append
仅传输源文件中超出目标文件长度的部分(即假设目标文件末尾之后的内容是新增的)。不校验文件内容是否一致,仅依赖文件长度判断续传位置。 -
因此
--append
一般无须使用,用-P
足够,只有传输的是持续增长且仅追加内容的文件(例如日志),且文件不会在传输过程中被修改(除了末尾追加),才适合使用。
原文链接: https://yanh.tech/2024/11/rsync-usage-guide/
版权声明:本博客所有文章除特別声明外,均为 AhFei 原创,采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 技焉洲 (yanh.tech) 。
保持更新 ٩(•̤̀ᵕ•̤́๑)ᵒᵏᵎᵎᵎᵎ 清晰恒益的实用技能,欢迎使用 RSS 订阅,如果能留言互动就更好了。
可在 Telegram 群组 https://t.me/vfly2 交流依文章步骤遇到的问题。