Linux-rsync文件和目录同步工具

rsync

The delta algorithm is not used when copying to a local filesystem.
本地使用 rsync 同步、复制文件时,差分算法不会起作用。因为经过测试发现,直接复制的速度比使用差分算法再复制更快。

rsync命令是一个远程数据同步工具,可通过LAN/WAN快速同步多台主机间的文件。rsync使用所谓的“rsync算法”来使本地和远程两个主机之间的文件达到同步,这个算法只传送两个文件的不同部分,而不是每次都整份传送,因此速度相当快。 rsync是一个功能非常强大的工具,其命令也有很多功能特色选项,我们下面就对它的选项一一进行分析说明。
http://man.linuxde.net/rsync
https://linux.die.net/man/1/rsync

1
2
3
4
5
6
rsync [OPTION]... SRC DEST
rsync [OPTION]... SRC [USER@]host:DEST
rsync [OPTION]... [USER@]HOST:SRC DEST
rsync [OPTION]... [USER@]HOST::SRC DEST
rsync [OPTION]... SRC [USER@]HOST::DEST
rsync [OPTION]... rsync://[USER@]HOST[:PORT]/SRC [DEST]
  • rsync + ssh 同步
1
2
3
4
rsync -vzrtopgs --progress -e ssh --delete work@172.16.78.192:/www/* /databack/experiment/rsync
# ssh 非默认端口号
rsync -vzrtopgs --progress -e "ssh -p 8022" --delete work@172.16.78.192:/www/* /databack/experiment/rsync
rsync -vzrtopgs --progress -e "ssh -p 8022" --delete ./somefile.py u0_a111@192.168.1.45:~/storage/shared/dir/
  • rsync 文件备份用
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
rsync -avS --update --delete --partial --progress /source.txt /destination.txt
# -P 等于 --partial --progress
rsync -avSP --update --delete /source.txt /destination.txt

# [remote -> local]备份手机存储中的`tencent`文件夹,不删除本地多余的文件
rsync -avcuSP u0_a111@192.168.1.45::/storage/0/tencent /未命名/TencentFilesBackup

# [remote -> local]通过ssh备份手机存储中的`tencent`文件夹,不删除本地多余的文件,排除MicroMsg目录
# 参考https://gist.github.com/KartikTalwar/4393116
# 参考https://serverfault.com/questions/590230/maximizing-rsync-performance-and-throughput-directly-connected-gigabit-servers
# 加密方式需与 aes128-gcm@openssh.com 对比
rsync\
-avcuSP\
--numeric-ids\
-e 'ssh -T -o Compression=no -x -p 8022'\
--exclude='*.log' --exclude 'MicroMsg'\
--exclude 'msflogs'\
--exclude 'wtlogin'\
--exclude 'tbs_live_log'\
--exclude 'tbs'\
--exclude 'tbs_audio_data'\
--exclude 'Midas'\
--exclude 'beacon'\
--exclude 'TMAssistantSDK'\
--exclude 'blob'\
--exclude 'MobileQQ/bless'\
--exclude 'MobileQQ/.pendant'\
--exclude 'MobileQQ/.gift'\
--skip-compress=$RSYNC_SKIP_COMPRESS\
u0_a212@192.168.0.16:~/storage/shared/tencent/ /Volumes/未命名/TencentFilesBackup

# 通过rsync server
rsync -avcuSP --numeric-ids --exclude 'MicroMsg' --port=8033 data1user@10.0.112.36::qq /Volumes/未命名/TencentFilesBackup
  • [local -> remote] 上传文件到 Server
1
2
3
4
5
6
7
8
9
10
11
12
13
rsync\
-avcuSP\
--delete\
--numeric-ids\
-e 'ssh -p 31802'\
--exclude='.git'\
--exclude='.idea'\
--exclude='*.db'\
--exclude='__pycache__'\
--exclude='.vscode'\
--exclude='venv'\
--exclude='.gitignore'\
~/Documents/ProjectPersonal/Folder root@13.18.19.21:/custom/Folder
  • rsync 一次性同步多个目录到远程同一个目录下,直接写多个源文件/目录就可以,rsync可以识别多个源文件或者目录。需要注意的是,这种情况下同步过后远程的目录结构。
1
2
3
# https://unix.stackexchange.com/a/368216/555309
rsync -a /etc/fstab /home/user/download remote_dir
# 同步过后远程的目录结构为:bkp/fstab bkp/download 和单独同步一个目录是一样的。

rsync -a 选项释义 archive mode

https://www.baeldung.com/linux/rsync-archive-mode

rsync 权限设置

  • 跳过文件压缩
1
2
export RSYNC_SKIP_COMPRESS=3fr/3g2/3gp/3gpp/7z/aac/ace/amr/apk/appx/appxbundle/arc/arj/arw/asf/avi/bz2/cab/cr2/crypt[5678]/dat/dcr/deb/dmg/drc/ear/erf/flac/flv/gif/gpg/gz/iiq/iso/jar/jp2/jpeg/jpg/k25/kdc/lz/lzma/lzo/m4[apv]/mef/mkv/mos/mov/mp[34]/mpeg/mp[gv]/msi/nef/oga/ogg/ogv/opus/orf/pef/png/qt/rar/rpm/rw2/rzip/s7z/sfx/sr2/srf/svgz/t[gb]z/tlz/txz/vob/wim/wma/wmv/xz/zip/z
rsync --skip-compress=$RSYNC_SKIP_COMPRESS .....
  • rsync 限制速度
    参数:--bwlimit,单位 KBPS
    例如:--bwlimit=1000

rsync 选项

  • --exclude=
1
2
rsync --exclude='a.txt' # 排除所有名称为 a.txt 的文件
rsync --exclude='/workingdir/a.txt' # 只排除根目录名称为 a.txt 的文件, workingdir为同步目录

参考:https://stackoverflow.com/a/36548449/8884704

  • 排除根目录的文件或者文件夹
    例:排除根目录下的 abc 文件夹
    假如运行的rsync命令是 rsync /remote/somefolder /local/destfolder
    那么,同步的结果就是会将somefolder同步到本地的/local/destfolder文件夹下面;
    如果远程目录下面有个abc文件夹我们不想同步,那么需要加上这个选项--exclude "/somefolder/abc"
    排除文件的选项以/开头,则是一个绝对路径,这个绝对路径是同步过程中目录的绝对路径。如果只写/abc是不行的。
    需要写/somefolder/abc
    猜测:rsync同步/remote/somefolder的时候先chroot到了/remote目录。这样rsync运行过程中远程根目录就变成了/remote;对应目标的目的目录 rsync chroot到了/local/destfolder这个目录。

目录同步规则

**注意,同步/RsyncFolder ==> /RsyncFolder与同步/RsyncFolder/ ==> /RsyncFolder是不同的。
/RsyncFolder ==> /RsyncFolder:将源/RsyncFolder同步到目标/RsyncFolder中,最后同步完成的目录结构为/RsyncFolder/RsyncFolder
/RsyncFolder/ ==> /RsyncFolder:将源/RsyncFolder/的内容同步到目标/RsyncFolder中,最后同步完成的目录结构为/RsyncFolder/
**
参考并区分: cp命令的目录结构复制规则,以及 tar、zip 命令的目录结构规则。

rsync 文件和目录匹配规则

注意:/的位置影响目录规则匹配

1
2
rsync --exclude '/tbs_live_log' root@192.168.0.117:~/storage/shared/tencent/ /backups
rsync --exclude '/tbs_live_log' root@192.168.0.117:~/storage/shared/tencent /backups
1
2
3
## 这种同步路径最后发现同步到了远端的 /DestnationFolder/DestnationFolder
# "$HOME/Downloads/DestnationFolder"\
# "username@hose.name:/filerepository/DestnationFolder"

rsync PATTERN 匹配规则

使用rsyncd服务

https://segmentfault.com/a/1190000000444614

参考

  1. rsync(一):基本命令和用法

Linux-rsync文件和目录同步工具
https://dnacore.github.io/post/854ed6da-1428-43fa-9f5b-c653fc3a15e3.html
作者
DNACore
发布于
2019年4月4日
更新于
2023年8月8日
许可协议