目录

远程和本地文件的互相同步

文章目录

  • [1、rsync实现类似git push pull功能](#1、rsync实现类似git push pull功能)
    • [1. 基础概念](#1. 基础概念)
    • [2. 示例操作](#2. 示例操作)
    • [3. 定制化和进阶用法](#3. 定制化和进阶用法)
    • [4. 定时同步(类似自动化)](#4. 定时同步(类似自动化))
  • [2 命令简化](#2 命令简化)
    • [1. 动态传参的脚本](#1. 动态传参的脚本)
    • [2. Shell 函数支持动态路径](#2. Shell 函数支持动态路径)
    • [3. 结合环境变量和参数(更简洁)](#3. 结合环境变量和参数(更简洁))
    • [4. Makefile 支持动态路径](#4. Makefile 支持动态路径)

使用场景,远程有一台无法连接互联网的服务器,性能强大;本地有一台性能差的电脑,但可以上网。那么要合并这两台电脑的功能,取其强,那么做为程序员,就是在本地编辑,再同步到远程,然后在远程执行。
rsync 是一个高效的文件同步工具,但它不像 Git 那样具有版本控制功能。你可以通过 rsync 在本地和远程主机之间同步文件,实现类似 Git 的 pushpull 操作。那么将使用rsync实现这个功能

1、rsync实现类似git push pull功能

以下是如何用 rsync 实现类似 Git 的 pushpull 操作:


1. 基础概念

  • Push:将本地的文件同步到远程。
  • Pull:将远程的文件同步到本地。

rsync 的基本语法:

bash 复制代码
rsync [选项] 源路径 目标路径

2. 示例操作

Push 操作:本地 → 远程

bash 复制代码
rsync -avz --delete /local/path/ user@remote_host:/remote/path/
  • /local/path/ 是本地目录(注意末尾的 /)。
  • user@remote_host:/remote/path/ 是远程主机的目标路径。
  • 关键选项:
    • -a:归档模式,保留文件权限、时间戳等。
    • -v:显示详细信息。
    • -z:启用压缩,提高传输效率。
    • --delete:删除目标路径中不在源路径中的文件,保持完全同步。

Pull 操作:远程 → 本地

bash 复制代码
rsync -avz --delete user@remote_host:/remote/path/ /local/path/
  • 语法类似于 push,只是把源路径和目标路径互换。

3. 定制化和进阶用法

排除某些文件或目录

使用 --exclude 选项:

bash 复制代码
rsync -avz --delete --exclude "node_modules/" --exclude "*.log" /local/path/ user@remote_host:/remote/path/

使用 SSH 密钥认证

为了避免频繁输入密码,可以设置 SSH 密钥认证:

  1. 生成 SSH 密钥:

    bash 复制代码
    ssh-keygen -t rsa
  2. 将公钥复制到远程主机:

    bash 复制代码
    ssh-copy-id user@remote_host

测试同步操作

使用 --dry-run 选项模拟操作,检查同步内容:

bash 复制代码
rsync -avz --dry-run /local/path/ user@remote_host:/remote/path/

4. 定时同步(类似自动化)

可以使用 cron 或 Windows 任务计划程序实现定时同步。例如:

Linux 上的 cron 示例

编辑 cron

bash 复制代码
crontab -e

添加如下内容,每 30 分钟同步一次:

bash 复制代码
*/30 * * * * rsync -avz --delete /local/path/ user@remote_host:/remote/path/

Windows 系统(任务计划程序)

rsync 命令写入 .bat 文件,并通过任务计划程序定时运行。


注意事项

  • 没有版本控制rsync 不支持历史记录,如果需要像 Git 那样的版本管理,可以结合 Git 使用。
  • 同步时注意删除操作 :使用 --delete 时,要确保备份数据,以免误删文件。
  • 网络问题rsync 的增量同步和中断恢复机制在网络不稳定时非常有用。

这套流程可以很好地模拟 pushpull 的功能,但如果需要更复杂的版本管理功能,建议直接使用 Git。

2 命令简化

如果路径是动态变化的,可以设计一个更灵活的解决方案,让你在运行时传递路径参数。以下是几种方法实现这一需求:


1. 动态传参的脚本

编写一个脚本,支持在运行时指定路径:

脚本内容

创建一个名为 sync.sh 的脚本,内容如下:

bash 复制代码
#!/bin/bash

# 检查参数
if [ "$#" -lt 3 ]; then
    echo "Usage: $0 [push|pull] [local_path] [remote_path]"
    exit 1
fi

ACTION=$1
LOCAL_PATH=$2
REMOTE_PATH=$3
REMOTE_USER="user"  # 替换为你的远程用户名
REMOTE_HOST="remote_host"  # 替换为你的远程主机

if [ "$ACTION" == "push" ]; then
    rsync -avz --delete "$LOCAL_PATH" "$REMOTE_USER@$REMOTE_HOST:$REMOTE_PATH"
elif [ "$ACTION" == "pull" ]; then
    rsync -avz --delete "$REMOTE_USER@$REMOTE_HOST:$REMOTE_PATH" "$LOCAL_PATH"
else
    echo "Invalid action: $ACTION. Use 'push' or 'pull'."
    exit 1
fi

赋予执行权限

bash 复制代码
chmod +x sync.sh

使用方法

运行时传递路径:

bash 复制代码
./sync.sh push /local/path /remote/path
./sync.sh pull /local/path /remote/path

2. Shell 函数支持动态路径

在 Shell 配置文件(如 ~/.bashrc~/.zshrc)中定义一个动态路径的函数:

函数定义

bash 复制代码
function sync() {
    if [ "$#" -lt 3 ]; then
        echo "Usage: sync [push|pull] [local_path] [remote_path]"
        return 1
    fi

    local action=$1
    local local_path=$2
    local remote_path=$3
    local remote_user="user"  # 替换为你的远程用户名
    local remote_host="remote_host"  # 替换为你的远程主机

    if [ "$action" == "push" ]; then
        rsync -avz --delete "$local_path" "$remote_user@$remote_host:$remote_path"
    elif [ "$action" == "pull" ]; then
        rsync -avz --delete "$remote_user@$remote_host:$remote_path" "$local_path"
    else
        echo "Invalid action: $action. Use 'push' or 'pull'."
        return 1
    fi
}

激活函数

bash 复制代码
source ~/.bashrc  # 或 ~/.zshrc

使用方法

bash 复制代码
sync push /local/path /remote/path
sync pull /local/path /remote/path

3. 结合环境变量和参数(更简洁)

在脚本中结合环境变量,减少重复输入常用的用户名和主机名:

脚本内容

bash 复制代码
#!/bin/bash

REMOTE_USER=${REMOTE_USER:-"user"}        # 默认远程用户名
REMOTE_HOST=${REMOTE_HOST:-"remote_host"}  # 默认远程主机

if [ "$#" -lt 3 ]; then
    echo "Usage: $0 [push|pull] [local_path] [remote_path]"
    exit 1
fi

ACTION=$1
LOCAL_PATH=$2
REMOTE_PATH=$3

if [ "$ACTION" == "push" ]; then
    rsync -avz --delete "$LOCAL_PATH" "$REMOTE_USER@$REMOTE_HOST:$REMOTE_PATH"
elif [ "$ACTION" == "pull" ]; then
    rsync -avz --delete "$REMOTE_USER@$REMOTE_HOST:$REMOTE_PATH" "$LOCAL_PATH"
else
    echo "Invalid action: $ACTION. Use 'push' or 'pull'."
    exit 1
fi

运行脚本时指定环境变量

bash 复制代码
REMOTE_USER=myuser REMOTE_HOST=myhost ./sync.sh push /local/path /remote/path

4. Makefile 支持动态路径

用 Makefile 传递路径参数:

Makefile 示例

makefile 复制代码
push:
	rsync -avz --delete $(LOCAL_PATH) user@remote_host:$(REMOTE_PATH)

pull:
	rsync -avz --delete user@remote_host:$(REMOTE_PATH) $(LOCAL_PATH)

使用方法

运行时指定变量:

bash 复制代码
make push LOCAL_PATH=/local/path REMOTE_PATH=/remote/path
make pull LOCAL_PATH=/local/path REMOTE_PATH=/remote/path

通过这些方式,你可以实现动态指定路径,同时保持命令简洁,推荐根据使用场景选择 脚本Shell 函数,它们最适合经常使用和路径灵活的需求。

本文是转载文章,点击查看原文
如有侵权,请联系 xyy@jishuzhan.net 删除
相关推荐
GalaxyPokemon3 小时前
MySQL基础 [一] - Ubuntu版本安装
linux·运维·ubuntu
musk12123 小时前
wsl2 配置ubuntu 固定ip
linux·tcp/ip·ubuntu
柳鲲鹏3 小时前
UBUNTU编译datalink
linux·运维·ubuntu
追随远方3 小时前
Ubuntu 64-bit 交叉编译 FFmpeg(高级用户指南)
linux·ubuntu·ffmpeg
科研土匪5 小时前
双系统ubuntu20.04不能外接显示器的解决办法
ubuntu·显示器
如若1236 小时前
《在 Ubuntu 22.04 上安装 CUDA 11.8 和 Anaconda,并配置环境变量》
linux·运维·ubuntu
不摆烂选手7 小时前
Ubuntu之Makefile入门
linux·ubuntu·makefile·正点原子imx6ull学习笔记
一大Cpp10 小时前
随笔1 认识编译命令
linux·opencv·ubuntu
开发小菜Go13 小时前
小菜Go:Ubuntu下Go语言开发环境搭建
linux·运维·ubuntu·vim
椰萝Yerosius21 小时前
Ubuntu Wayland启动腾讯会议并实现原生屏幕共享
linux·ubuntu·腾讯会议