自己寫個 `rsync` + `fswatch` 實時增量同步腳本,干掉 Cursor AI、Sublime Text 的SFTP等 插件!

在這里插入圖片描述

自己寫個 rsync + fswatch 實時增量同步腳本,干掉 Cursor AI、Sublime Text 的 SFTP等 插件!

作為一個碼農,我最頭疼的事情之一就是編輯器同步代碼到服務器這塊。用過各種各樣的sftp、rsync插件,感覺不好用。。

我琢磨著:難道就沒有既快速,又安全,還能只上傳修改過文件差異的解決方案?最終,我自己動手寫了個基于 rsync + fswatch 的實時增量同步腳本,實現了只同步新增和修改文件,不做全量同步,支持任何編輯器,簡單又靠譜。


說說這幾個插件的坑

  • Cursor AI 的 SFTP:傳輸速度慢得哭,尤其項目文件多一點,等得我花兒都謝了。
  • Sublime Text 的 SFTP:要收費,雖說速度能快點,但不支持 rsync,上傳的是整個文件,沒法只傳差異處,浪費流量和時間。

我的解決思路

為什么不自己寫個腳本,用 rsync 來同步,只針對新增和修改的文件?而且還不被編輯器限制?

  • 只上傳改動的文件,大大節省時間和帶寬
  • fswatch 實時監聽文件變化,做到自動觸發同步
  • 支持配置排除目錄,避免上傳 .gitnode_modules 等垃圾文件夾
  • 彩色輸出日志,清晰明了,方便調試
  • 同步成功還能播放提示音,避免盯屏幕發呆
  • 任何編輯器都能用,不依賴插件,靈活又安全

環境準備

  • macOS/Linux,本文以 macOS 為例
  • 安裝 fswatch
  brew install fswatch
  • 安裝 jq
  brew install jq
  • 配置好 SSH 免密登錄服務器

配置文件示例(rsync_config.json

{"remote_host": "11.22.33.44","remote_user": "root","remote_path": "/www/wwwroot/test.myprojec.com","exclude": [".git", "node_modules", "dist"]
}

核心腳本:rsync_project.sh

#!/bin/bashRED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
MAGENTA='\033[0;35m'
CYAN='\033[0;36m'
RESET='\033[0m'# 獲取腳本路徑
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
TIMESTAMP=$(date +%s)
LOG_FILE="$SCRIPT_DIR/.rsync_sync_${TIMESTAMP}.log"if [[ -z "$1" ]]; thenecho -e "${RED}[錯誤] 請輸入項目根目錄路徑,比如:sh rsync_project.sh ~/my-project${RESET}"exit 1
fiPROJECT_DIR="$(cd "$1" && pwd)"
CONFIG_FILE="$PROJECT_DIR/rsync_config.json"
DETAILED=falsefor arg in "$@"; doif [[ "$arg" == "--detail" ]]; thenDETAILED=truefi
doneif [[ ! -f "$CONFIG_FILE" ]]; thenecho -e "${RED}[錯誤] 找不到配置文件:$CONFIG_FILE${RESET}"exit 1
fiif ! command -v jq &> /dev/null; thenecho -e "${RED}[錯誤] 你需要先裝 jq:brew install jq${RESET}"exit 1
fiif ! command -v fswatch &> /dev/null; thenecho -e "${RED}[錯誤] 你需要先裝 fswatch:brew install fswatch${RESET}"exit 1
fiREMOTE_HOST=$(jq -r '.remote_host' "$CONFIG_FILE")
REMOTE_USER=$(jq -r '.remote_user' "$CONFIG_FILE")
REMOTE_PATH=$(jq -r '.remote_path' "$CONFIG_FILE")EXCLUDE_ARR=()
for line in $(jq -r '.exclude[]?' "$CONFIG_FILE"); doEXCLUDE_ARR+=("${line%/}")
doneif [[ -z "$REMOTE_HOST" || -z "$REMOTE_USER" || -z "$REMOTE_PATH" ]]; thenecho -e "${RED}[錯誤] 配置文件缺少 remote_host、remote_user 或 remote_path${RESET}"exit 1
fiecho -e "${BLUE}[測試] 嘗試連接 $REMOTE_USER@$REMOTE_HOST ...${RESET}"
ssh -q -o ConnectTimeout=5 "$REMOTE_USER@$REMOTE_HOST" "echo pong" 2>/dev/null
if [[ $? -ne 0 ]]; thenecho -e "${RED}[失敗] 無法連接服務器 $REMOTE_USER@$REMOTE_HOST,請檢查 SSH 配置${RESET}"exit 1
fiecho -e "${GREEN}[] 成功連接服務器:$REMOTE_USER@$REMOTE_HOST${RESET}"
echo -e "${CYAN}目標路徑:$REMOTE_PATH${RESET}"
$DETAILED && echo -e "${YELLOW}[模式] 詳細日志已啟用${RESET}"
echo -e "${BLUE}[日志] 同步記錄保存到:$LOG_FILE${RESET}"HAS_OSASCRIPT=false
command -v osascript &> /dev/null && HAS_OSASCRIPT=trueecho -e "${BLUE}[監聽中] 等待文件變更...${RESET}"fswatch -0 -e "\\.DS_Store$" "$PROJECT_DIR" | while IFS= read -r -d "" changed_path; doskip=falsefor excl in "${EXCLUDE_ARR[@]}"; do[[ "$changed_path" == *"/$excl/"* || "$changed_path" == *"/$excl"* ]] && skip=true && breakdone$skip && continue[[ ! -f "$changed_path" ]] && continueREL_PATH="${changed_path#"$PROJECT_DIR"/}"CURRENT_TIME=$(date '+%Y-%m-%d %H:%M:%S')echo ""echo -e "${BLUE}[變更] 文件新增或修改:$REL_PATH${RESET}"echo -e "${MAGENTA}[時間] $CURRENT_TIME${RESET}"RSYNC_CMD=(rsync -az -e "ssh")RSYNC_CMD+=(--rsync-path="mkdir -p \"$(dirname "$REMOTE_PATH/$REL_PATH")\" && rsync")RSYNC_CMD+=("$changed_path" "$REMOTE_USER@$REMOTE_HOST:$REMOTE_PATH/$REL_PATH")if $DETAILED; thenecho -e "${CYAN}[執行] rsync 命令:${RESET}"printf '%q ' "${RSYNC_CMD[@]}"echo ""elseecho -e "${CYAN}[執行] 正在同步文件...${RESET}"fiecho "[$CURRENT_TIME] 變更文件: $REL_PATH" >> "$LOG_FILE""${RSYNC_CMD[@]}" >> "$LOG_FILE" 2>&1if [[ $? -eq 0 ]]; then# 同步成功后設置 chownssh "$REMOTE_USER@$REMOTE_HOST" "chown www:www \"$REMOTE_PATH/$REL_PATH\"" >> "$LOG_FILE" 2>&1echo -e "${GREEN}[完成] 同步成功 ? 并設置權限為 www:www${RESET}"echo "[$CURRENT_TIME] ? 同步成功并設為 www" >> "$LOG_FILE"if command -v afplay &> /dev/null; thenafplay /System/Library/Sounds/Tink.aiff &fi$HAS_OSASCRIPT && osascript -e 'display notification "文件同步成功" with title "rsync" sound name "Glass"'elseecho -e "${RED}[失敗] 同步失敗 ?${RESET}"echo "[$CURRENT_TIME] ? 同步失敗" >> "$LOG_FILE"$HAS_OSASCRIPT && osascript -e 'display notification "文件同步失敗" with title "rsync" sound name "Basso"'fi
done

使用方法

bash rsync_project.sh myprojec --detail

替換 myprojec 為你的項目目錄,--detail 參數可選,開啟詳細日志。


結語

用這套腳本后,文件改動幾乎立刻上傳,速度杠杠的,且不亂上傳無用文件,安全又高效。再也不用擔心編輯器 SFTP 插件各種坑,支持所有編輯器,只要能保存文件,統統適用。

如果你也被那些插件折磨過,不妨試試我這套 rsync + fswatch 腳本,真心好用!

歡迎大家留言交流,遇到問題咱們一起吐槽、優化!

Happy coding! 🚀

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/89137.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/89137.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/89137.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

linux中at命令的常用用法。

Linux 中 at 命令用于安排一次性定時任務,需要用到在某個時間只需要執行一次的命令的時候,可以使用at 1:安裝at # Debian/Ubuntu sudo apt install at# CentOS/RHEL sudo yum install at2:啟動at sudo systemctl start atd # 啟…

【安卓筆記】RxJava的使用+修改功能+搭配retrofit+RxView防快速點擊

0. 環境: 電腦:Windows10 Android Studio: 2024.3.2 編程語言: Java Gradle version:8.11.1 Compile Sdk Version:35 Java 版本:Java11 1. 介紹RxJava GitHub開源地址:https://github.com/Reactive…

Windows 下原生使用 claude code + Kimi K2

搞定了kimi k2 claude code在windows下原生使用 Windows下使用claude code的障礙是shell環境(命令行),非posix風格shell無法正常讓claude code讀取到url和key, 導致無法使用。解決問題的本質是使用符合posix風格的shell環境,我們…

Leetcode Easy題小解(C++語言描述)1

Leetcode Easy題小解(C語言描述) 相交鏈表 給你兩個單鏈表的頭節點 headA 和 headB ,請你找出并返回兩個單鏈表相交的起始節點。如果兩個鏈表不存在相交節點,返回 null 。 圖示兩個鏈表在節點 c1 開始相交**:**題目數據…

EP01:【NLP 第二彈】自然語言處理概述

一、NLP通向智能之路 1.1 圖靈測試 1.1.1 提出背景 由計算機科學家阿蘭?圖靈于 1950 年提出,是早期衡量機器智能水平的重要概念。 1.1.2 提出目的 判斷機器是否能表現出與人類相當的智能行為。 1.1.3 測試原理 場景設定:測試中存在一位人類測試者&#…

Ansible 查看PostgreSQL的版本

Ansible的基礎知識就不說了直接貼劇本- name: Check PostgreSQL versionhosts: db_serversbecome: yesvars:ansible_python_interpreter: /usr/bin/python3db_name: postgresdb_user: postgresdb_password: your_passwordtasks:- name: Install psycopg2ansible.builtin.packag…

【視覺SLAM筆記】第9章 后端1

一、理論1. 狀態估計的概率解釋我們來深入探討一下視覺SLAM中狀態估計的概率解釋。這可以說是理解現代SLAM算法(尤其是后端優化)的基石1. 問題的核心:不確定性SLAM(同步定位與建圖)的本質是在一個未知環境中&#xff0…

(數據結構)復雜度

基本概念說明 數據結構 定義:數據結構(Data Structure)是計算機存儲、組織數據的方式,指相互之間存在?種或多種特定關系的數據元素的集合。沒有?種單?的數據結構對所有用途都有用(要考慮適配、效率問題,在不同情況下使用合適的…

玩轉Docker | 使用Docker部署bender個人導航頁工具

玩轉Docker | 使用Docker部署bender個人導航頁工具 前言 一、bender介紹 Bender 簡介 Bender 的主要特點 二、系統要求 環境要求 環境檢查 Docker版本檢查 檢查操作系統版本 三、部署bender服務 下載bender鏡像 編輯部署文件 創建容器 檢查容器狀態 檢查服務端口 安全設置 四、…

解決了困擾我的upload靶場無法解析phtml等后綴的問題

本文章為解決困擾我的 upload 靶場無法解析 phtml 問題 ? 這個問題直接讓我過不了Upload-Pass-03這一關,一直卡著。 ? 痛太痛了 ,為什么無法解析上傳之后的 phtml 后綴文件!這塊兒折磨了博主一天多,太不容易了,查找…

Leetcode百題斬-二分搜索

二分搜索也是一個很有趣的專題,被做過的題中,剛好一個Easy,一個Medium和一個Hard,剛好可以看看,二分搜索的三個難度等級都是啥樣的。 124. Binary Tree Maximum Path Sum[Hard](詳見二叉樹專題)…

【IDEA】格式化代碼工具配置

格式化代碼快捷鍵: CtrlAltL格式代碼的時候不會再方法名與參數中間添加空格默認不勾選的情況下:代碼樣例:勾選之后的樣例:選擇不勾選,IDEA默認情況下就是不勾選的狀態忽略加載文件有些非必要加載到開發工具中的文件我們…

驅動開發(3)|rk356x驅動GPIO基礎應用之點亮led燈

點亮LED燈看似是一個基礎的操作,但實際上,許多高級應用也依賴于高低電平的切換。例如,脈沖寬度調制(PWM)信號可以用來精確控制電機的轉速,通過改變脈沖的頻率和占空比,實現對電機的精確調節&…

手動搭建PHP環境:步步為營,解鎖Web開發

目錄一、引言二、準備工作2.1 明確所需軟件2.2 下載軟件三、Windows 系統搭建步驟3.1 安裝 Apache 服務器3.2 安裝 PHP3.3 集成 Apache 與 PHP3.4 安裝 MySQL3.5 配置 PHP 連接 MySQL四、Linux 系統搭建步驟(以 Ubuntu 為例)4.1 更新系統4.2 安裝 Apache…

DrissionPage:一款讓網頁自動化更簡單的 Python 庫

在網頁自動化領域,Selenium 和 Playwright 早已是開發者耳熟能詳的工具。但今天要給大家介紹一款更輕量、更易用的 Python 庫 ——DrissionPage。它以 "融合 selenium 和 requests 優勢" 為核心設計理念,既能像 requests 一樣高效處理靜態網頁…

理解Grafana中`X-Scope-OrgID`的作用與配置

X-Scope-OrgID的作用 該HTTP Header用于標識Loki日志數據的所屬租戶(組織)。在多租戶模式下,Loki通過此Header隔離不同團隊或用戶的數據,確保查詢和存儲的獨立性。數據隔離: 租戶A的日志標記為X-Scope-OrgID: team-a&a…

【PycharmPyqt designer桌面程序設計】

在 main.py 中調用 Qt Designer 生成的 windows.py(假設它是 PySide2 版)。 只要把兩個文件放在同一目錄即可直接運行。 ──────────────────── 1?? windows.py(Qt Designer 生成,已轉碼) # -*-…

Unity Android Logcat插件 輸出日志中文亂碼解決

背景之前安卓真機調試看日志,一直用的是Android Studio自帶的adb命令進行看日志,不太方便,改用Unity自帶的安卓日志插件時,存在中文日志亂碼問題。插件安裝基于Unity6000.1.11版本:Window -> Package Management -&…

Halcon雙相機單標定板標定實現拼圖

1.Halcon圖像拼接算法在之前的文章里也寫過,主要是硬拼接和特征點拼接兩種方式,今天增加另一種拼接圖像的方式。應用場景是多個相機聯合一起拍大尺寸的物體,并且相機視野之間存在重疊區域。通過在同一個標定板上面標定,計算兩個相…

動物世界一語乾坤韻芳華 人工智能應用大學畢業論文 -仙界AI——仙盟創夢IDE

提示詞在一個奇幻的童話森林里,所有的動物都像人類一樣直立行走,穿著各種搞怪的衣服。 一只戴著超大眼鏡、穿著背帶褲的烏龜,正一本正經地站在一個蘑菇舞臺上,拿著一根樹枝當作麥克風,準備唱歌。它的眼鏡總是往下滑&am…