Rsync 用法指南 | 文件传输与同步技巧

Rsync 是一个用于同步文件的工具。它可以在本地计算机与远程计算机之间,或者两个本地目录之间同步文件。它支持断点续传、增量同步,广泛用于使用网络迁移大量文件;另外,在内置硬盘和外置硬盘之间数据迁移的场景下,它可以替代 cpmv 命令。

它会检查发送方和接收方已有的文件,仅传输有变动的部分(默认规则是文件大小或修改时间有变动)。

官网: 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参数指定这个文件
  • --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/

后台传输

上面运行后,终端不能关闭,否则传输也就终止了,当执行耗时的任务时,就很不方便。

下面将任务挪至后台,就不必受此限制,但是不好输入密码,因此必须先配置证书通过无密码登录。要改的地方有两点:

  1. 在开头加上 nohup
  2. 在结尾加上 > ~/rsync_movie.log 2>&1 &
  3. 如果要查看任务进度,使用 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 交流依文章步骤遇到的问题。

暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇