windows下使用rsync做文件同步
windows下我本身装有 git 可以使用msys的当时来执行rsync,我是觉得cwrsync和cywin太大了,所以用的 git 下的
1. 简介
在 Windows 下运行 rsync 的方法总结
rsync 简介
rsync 是一个用于 Linux 和 Unix 系统的文件同步和传输工具,能够高效地同步本地文件和远程服务器之间的文件。
在 Windows 下运行 rsync 的挑战
由于 rsync 是基于 Linux 的程序,直接在 Windows 下运行需要一些额外的步骤。
传统方法
-
源码编译:
- 使用 MinGW 等编译工具在 Windows 环境下重新编译 rsync 源码。
- 需要对源码进行一定修改。
- 复杂且容易出错。
-
虚拟环境:
- 使用 Cygwin 或 WSL(Windows Subsystem for Linux)等创建 Linux 虚拟环境。
- Cygwin 较为庞大,WSL 需要 Windows 10 及以上版本且配置较为复杂。
更简单的方法
利用 Git Bash 提供的 Linux 环境来运行 rsync。Git Bash 能够在 Windows 下提供类似 Linux 的命令行环境,这得益于它基于 MSYS2 的构建。
MSYS2 简介
-
起源:
- MSYS 是 MinGW 项目的一个分支,旨在提供一个更友好的命令行环境。
- MSYS2 是 MSYS 的后续版本,由 Cygwin 分支发展而来,并加入了 Pacman 包管理器。
-
功能:
- 提供 Linux 命令行的类似体验。
- 使用 Pacman 包管理器管理软件包。
Git for Windows
- 基于 MSYS2 构建。
- Git 开发者对 MSYS2 进行了精简和修改,以适应 Git 的需求。
- ls、grep 等 Linux 命令通过 Pacman 包管理器进行管理。
在 Git Bash 中运行 rsync 的实现过程
-
安装 Git for Windows:
- 下载并安装 Git for Windows,该安装包包含了 MSYS2 环境。
-
使用 Pacman 安装 rsync:
- 打开 Git Bash。
- 使用 Pacman 包管理器安装 rsync 包。
- 命令示例:
pacman -S rsync
-
验证安装:
- 在 Git Bash 中输入
rsync --version
以验证 rsync 是否成功安装。
- 在 Git Bash 中输入
通过上述方法,用户可以在 Windows 下的 Git Bash 环境中轻松运行 rsync,实现文件同步和传输功能,而无需复杂的配置或源码编译。
原文链接:https://blog.csdn.net/yxlyttyxlytt/article/details/137262583
2. 安装方法
先安装 windows 下 git ,然后安装下面的。
官方下载地址
https://repo.msys2.org/msys/x86_64/
也可以用我下载好的几个包
libxxhash-0.8.2-1-x86_64.pkg.tar.zst
libzstd-1.5.6-1-x86_64.pkg.tar.zst
rsync-3.3.0-1-x86_64.pkg.tar.zst
zstd-1.5.6-1-x86_64.pkg.tar.zst
用7zip解压
解压后每个程序都回生成一个 usr (文件夹里面可能包含 bin、lib、share ),将 usr 文件拷贝到 Git 安装目录(D:\300-Work-工作\S-sofrware-软件工具\G-Git\usr)下即
然后在cmd下就能使用了,不一定非要在 git bash 下才能用
3. windows下rsync同步脚本
3.1. 参考示例
rsync -avz -e "ssh -i C:/path/to/your/private/key" --delete /local/source/ myuser@remote.example.com:/remote/destination/
这个rsync
命令使用了多个参数和选项来执行文件同步操作,并且通过SSH协议(使用指定的私钥文件)连接到远程服务器。下面是对这个命令中各个部分的详细解释:
-
rsync
: 这是一个常用于Linux和Unix系统中进行文件同步和复制的工具,也可以用于Windows系统(通常通过Cygwin、WSL或其他兼容层)。 -
-avz
: 这是一个组合选项,由三个单独的选项组成,每个选项都有其特定的作用:-a
或--archive
:归档模式,表示以递归方式传输文件,并保持原有的文件属性(如时间戳、权限等),同时还会保留符号链接、设备文件、属性、权限等。这相当于-rlptgoD
选项的组合。-v
或--verbose
:详细模式,输出更多的信息,让你了解rsync
正在做什么。-z
或--compress
:在传输过程中对数据进行压缩,这有助于减少网络带宽的使用,但会增加CPU的使用率。
-
-e "ssh -i C:/path/to/your/private/key"
: 这个选项允许你指定用于远程shell的命令。在这个例子中,它指定了使用SSH(Secure Shell)协议进行连接,并通过-i
选项指定了私钥文件的路径。这个私钥文件用于SSH认证,而不是使用密码。注意,这里的路径C:/path/to/your/private/key
是基于Windows的路径格式,如果你在Unix或Linux环境下执行这个命令,应该使用相应的文件系统路径(如/path/to/your/private/key
)。 -
--delete
: 这个选项告诉rsync
在远程目标目录中删除那些在源目录中已经不存在但之前已经被复制过去的文件。换句话说,它会使得目标目录精确地镜像源目录的状态。 -
/local/source/
: 这是源目录的路径,即你想要同步的文件或目录所在的位置。 -
myuser@remote.example.com:/remote/destination/
: 这是远程目标目录的路径,格式为用户名@主机名:路径
。这里myuser
是远程服务器上的用户名,remote.example.com
是远程服务器的地址,/remote/destination/
是远程服务器上你想要同步到的目录路径。
综上所述,这个命令的作用是:以归档模式、详细模式并且启用压缩,使用指定的SSH私钥文件通过SSH连接到远程服务器remote.example.com
,将本地目录/local/source/
中的文件同步到远程服务器上的/remote/destination/
目录中,并且在同步过程中删除远程目录中那些在本地目录中已不存在的文件。
3.2. 实际操作
D:\300-Work-工作\S-sofrware-软件工具\G-Git\usr\bin\rsync -avz -e "D:\300-Work-工作\S-sofrware-软件工具\G-Git\usr\bin\ssh -i D:\key\rsa" --exclude='vx_attachments/' --exclude='vx_images/' --exclude='vx_notebook/' --exclude='vx_recycle_bin/' --exclude='vx.json' --delete /d/010-Workbench/N-note/ ivo@888888.xyz:/srv/all/
这里要用绝对路径才能保证软件的运行
- -avz 递归压损
- -e "D:\300-Work-工作\S-sofrware-软件工具\G-Git\usr\bin\ssh -i D:\key\rsa" ssh 私钥
- --delete 两边保持一致
- --exclude='vx_notebook/' --exclude='vx_recycle_bin/' --exclude='vx.json' 不同步的几个目录
- /d/010-Workbench/N-note/* 源文件夹,这里d:\ 的路径要写成前面的样子不能用windows的格式
- ivo@888888.xyz:/srv/all/ 目标
4. 发送同步文件 sync_blob.bat
直接把文件丢掉脚本上
@echo off
:: 假设日期格式为 "YYYY/MM/DD 周X"
for /f "tokens=1,2 delims=/" %%a in ('date /t') do (
set "year=%%a"
set "month=%%b"
)
rem 拼接日期
set "pathdate=%year%/%month%"
rem 设置上传路径(使用不同的变量名)
set "upload_path=/srv/all/%pathdate%/"
rem 设置 web路径
set "web_base=http://blob.888888.xyz"
rem 完整的web路径(注意这里没有直接拼接文件名)
set "web_full=%web_base%/%pathdate%"
rem rem 接受外面的第一个参数,图片路径
rem set "picture=%~1"
rem echo Picture Path: %picture%
rem 从参数里面获取文件名
set "file_name=%~nx1"
rem echo File Name: %file_name%
rem 返回 markdown 格式的图片链接
set "markdown_blob=![](%web_full%/%file_name%)"
echo markdown_blob:%markdown_blob%
:: 使用 for /f 来“清理”输出(尽管这不是必要的)
for /f "delims=" %%i in ("%markdown_blob%") do set "output=%%i"
<nul set /p="%output%"|clip.exe
setlocal
:: 接收第一个参数作为文件路径
set "OriginalFilePath=%~1"
:: 去除file:///前缀(如果它存在的话)
set "CleanedFilePath=%OriginalFilePath:file:///=%"
:: 将正斜杠(/)替换为反斜杠(\)
set "WindowsPath=%CleanedFilePath:/=\%"
:: 现在WindowsPath变量包含了处理后的Windows风格路径
echo %WindowsPath%
:: 在这里添加你使用处理后的路径的代码
set "pscp=D:\010-Workbench\P-putty\pscp.exe"
%pscp% -i "D:\key\prv.ppk" %WindowsPath% ivo@debian:%upload_path%
endlocal