名称: clawdbot-backup
描述: 备份与恢复 ClawdBot 的配置、技能、命令和设置。支持跨设备同步、Git 版本控制、自动备份以及迁移到新机器。
主页: https://github.com/clawdbot/backup-skill
元数据: {"clawdbot":{"emoji":"💾","requires":{"bins":["git","tar","rsync"],"env":[]}}}
直接在 ClawdBot 中备份、恢复和同步你的配置到不同设备。
此技能帮助你:
- 备份所有 ClawdBot 数据和设置
- 从备份中恢复
- 在多台机器间同步
- 对配置进行版本控制
- 自动化备份流程
- 迁移到新设备
~/.claude/ # ClawdBot 主目录
├── settings.json # 全局设置
├── settings.local.json # 本地覆盖设置(机器特定)
├── projects.json # 项目配置
├── skills/ # 你的自定义技能
│ ├── skill-name/
│ │ ├── SKILL.md
│ │ └── supporting-files/
│ └── another-skill/
├── commands/ # 自定义斜杠命令(旧版)
│ └── command-name.md
├── contexts/ # 保存的上下文
├── templates/ # 响应模板
└── mcp/ # MCP 服务器配置
└── servers.json
~/projects/ # 你的项目(可选备份)
├── project-1/
│ └── .claude/ # 项目特定配置
│ ├── settings.json
│ └── skills/
└── project-2/
必需备份(始终备份):
✓ ~/.claude/skills/ # 自定义技能
✓ ~/.claude/commands/ # 自定义命令
✓ ~/.claude/settings.json # 全局设置
✓ ~/.claude/mcp/ # MCP 配置
推荐备份(通常备份):
✓ ~/.claude/contexts/ # 保存的上下文
✓ ~/.claude/templates/ # 模板
✓ 项目中的 .claude/ 文件夹 # 项目配置
可选备份(视情况而定):
○ ~/.claude/settings.local.json # 机器特定设置
○ 缓存目录 # 可以重建
○ 日志文件 # 通常不需要
# 创建带时间戳的备份
BACKUP_DIR="$HOME/clawdbot-backups"
TIMESTAMP=$(date +%Y%m%d_%H%M%S)
BACKUP_NAME="clawdbot_backup_$TIMESTAMP"
mkdir -p "$BACKUP_DIR"
tar -czvf "$BACKUP_DIR/$BACKUP_NAME.tar.gz" \
-C "$HOME" \
.claude/skills \
.claude/commands \
.claude/settings.json \
.claude/mcp \
.claude/contexts \
.claude/templates \
2>/dev/null
echo "备份已创建:$BACKUP_DIR/$BACKUP_NAME.tar.gz"
# 仅备份技能
tar -czvf ~/clawdbot_skills_$(date +%Y%m%d).tar.gz \
-C "$HOME" .claude/skills .claude/commands
# 恢复完整备份
BACKUP_FILE="$HOME/clawdbot-backups/clawdbot_backup_20260129.tar.gz"
# 首先预览内容
tar -tzvf "$BACKUP_FILE"
# 恢复(将覆盖现有文件)
tar -xzvf "$BACKUP_FILE" -C "$HOME"
echo "恢复完成!"
#!/bin/bash
# clawdbot-backup.sh - 全面的 ClawdBot 备份工具
set -e
# 配置
BACKUP_ROOT="${CLAWDBOT_BACKUP_DIR:-$HOME/clawdbot-backups}"
CLAUDE_DIR="$HOME/.claude"
MAX_BACKUPS=10 # 保留最近 N 个备份
TIMESTAMP=$(date +%Y%m%d_%H%M%S)
# 颜色定义
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
NC='\033[0m'
log_info() { echo -e "${GREEN}[信息]${NC} $1"; }
log_warn() { echo -e "${YELLOW}[警告]${NC} $1"; }
log_error() { echo -e "${RED}[错误]${NC} $1"; }
# 检查 ClawdBot 目录是否存在
check_claude_dir() {
if [ ! -d "$CLAUDE_DIR" ]; then
log_error "未找到 ClawdBot 目录:$CLAUDE_DIR"
exit 1
fi
}
# 创建备份
create_backup() {
local backup_type="${1:-full}"
local backup_name="clawdbot_${backup_type}_${TIMESTAMP}"
local backup_path="$BACKUP_ROOT/$backup_name.tar.gz"
mkdir -p "$BACKUP_ROOT"
log_info "正在创建 $backup_type 备份..."
case $backup_type in
full)
tar -czvf "$backup_path" \
-C "$HOME" \
.claude/skills \
.claude/commands \
.claude/settings.json \
.claude/settings.local.json \
.claude/projects.json \
.claude/mcp \
.claude/contexts \
.claude/templates \
2>/dev/null || true
;;
skills)
tar -czvf "$backup_path" \
-C "$HOME" \
.claude/skills \
.claude/commands \
2>/dev/null || true
;;
settings)
tar -czvf "$backup_path" \
-C "$HOME" \
.claude/settings.json \
.claude/settings.local.json \
.claude/mcp \
2>/dev/null || true
;;
*)
log_error "未知备份类型:$backup_type"
exit 1
;;
esac
if [ -f "$backup_path" ]; then
local size=$(du -h "$backup_path" | cut -f1)
log_info "备份已创建:$backup_path ($size)"
else
log_error "备份失败!"
exit 1
fi
}
# 列出备份
list_backups() {
log_info "$BACKUP_ROOT 中的可用备份:"
echo ""
if [ -d "$BACKUP_ROOT" ]; then
ls -lh "$BACKUP_ROOT"/*.tar.gz 2>/dev/null | \
awk '{print $9, $5, $6, $7, $8}' || \
echo "未找到备份。"
else
echo "备份目录不存在。"
fi
}
# 恢复备份
restore_backup() {
local backup_file="$1"
if [ -z "$backup_file" ]; then
log_error "请指定备份文件"
list_backups
exit 1
fi
if [ ! -f "$backup_file" ]; then
# 尝试在备份目录中查找相对路径
backup_file="$BACKUP_ROOT/$backup_file"
fi
if [ ! -f "$backup_file" ]; then
log_error "未找到备份文件:$backup_file"
exit 1
fi
log_warn "这将覆盖现有配置!"
read -p "继续?(y/N) " confirm
if [ "$confirm" != "y" ] && [ "$confirm" != "Y" ]; then
log_info "已取消恢复。"
exit 0
fi
log_info "正在从 $backup_file 恢复..."
tar -xzvf "$backup_file" -C "$HOME"
log_info "恢复完成!"
}
# 清理旧备份
cleanup_backups() {
log_info "正在清理旧备份(保留最近 $MAX_BACKUPS 个)..."
cd "$BACKUP_ROOT" 2>/dev/null || return
local count=$(ls -1 *.tar.gz 2>/dev/null | wc -l)
if [ "$count" -gt "$MAX_BACKUPS" ]; then
local to_delete=$((count - MAX_BACKUPS))
ls -1t *.tar.gz | tail -n "$to_delete" | xargs rm -v
log_info "已删除 $to_delete 个旧备份"
else
log_info "无需清理(现有 $count 个备份)"
fi
}
# 显示备份统计信息
show_stats() {
log_info "ClawdBot 备份统计"
echo ""
echo "=== 目录大小 ==="
du -sh "$CLAUDE_DIR"/skills 2>/dev/null || echo "技能:N/A"
du -sh "$CLAUDE_DIR"/commands 2>/dev/null || echo "命令:N/A"
du -sh "$CLAUDE_DIR"/mcp 2>/dev/null || echo "MCP:N/A"
du -sh "$CLAUDE_DIR" 2>/dev/null || echo "总计:N/A"
echo ""
echo "=== 技能数量 ==="
find "$CLAUDE_DIR/skills" -name "SKILL.md" 2>/dev/null | wc -l | xargs echo "技能:"
find "$CLAUDE_DIR/commands" -name "*.md" 2>/dev/null | wc -l | xargs echo "命令:"
echo ""
echo "=== 备份目录 ==="
if [ -d "$BACKUP_ROOT" ]; then
du -sh "$BACKUP_ROOT"
ls -1 "$BACKUP_ROOT"/*.tar.gz 2>/dev/null | wc -l | xargs echo "备份文件:"
else
echo "暂无备份"
fi
}
# 使用说明
usage() {
cat << EOF
ClawdBot 备份工具
用法:$(basename $0) <命令> [选项]
命令:
backup [类型] 创建备份(类型:full, skills, settings)
restore <文件> 从备份文件恢复
list 列出可用备份
cleanup 清理旧备份(保留最近 $MAX_BACKUPS 个)
stats 显示备份统计信息
help 显示此帮助信息
示例:
$(basename $0) backup # 完整备份
$(basename $0) backup skills # 仅备份技能
$(basename $0) restore latest.tar.gz
$(basename $0) list
$(basename $0) cleanup
环境变量:
CLAWDBOT_BACKUP_DIR 备份目录(默认:~/clawdbot-backups)
EOF
}
# 主函数
main() {
check_claude_dir
case "${1:-help}" in
backup)
create_backup "${2:-full}"
;;
restore)
restore_backup "$2"
;;
list)
list_backups
;;
cleanup)
cleanup_backups
;;
stats)
show_stats
;;
help|--help|-h)
usage
;;
*)
log_error "未知命令:$1"
usage
exit 1
;;
esac
}
main "$@"
# 保存脚本
cat > ~/.local/bin/clawdbot-backup << 'SCRIPT'
# 在此处粘贴脚本内容
SCRIPT
chmod +x ~/.local/bin/clawdbot-backup
# 使用
clawdbot-backup backup # 完整备份
clawdbot-backup backup skills # 仅备份技能
clawdbot-backup list # 列出备份
clawdbot-backup restore <文件> # 恢复
cd ~/.claude
# 初始化 git
git init
# 创建 .gitignore
cat > .gitignore << 'EOF'
# 机器特定设置
settings.local.json
# 缓存和临时文件
cache/
*.tmp
*.log
# 大文件
*.tar.gz
*.zip
# 敏感数据(如有)
*.pem
*.key
credentials/
EOF
# 初始提交
git add .
git commit -m "初始 ClawdBot 配置备份"
# 添加远程仓库(GitHub, GitLab 等)
git remote add origin git@github.com:username/clawdbot-config.git
# 推送
git push -u origin main
# 修改技能/设置后
cd ~/.claude
git add .
git commit -m "更新技能:trading-bot"
git push
#!/bin/bash
# auto-commit-claude.sh - 自动提交更改
cd ~/.claude || exit 1
# 检查是否有更改
if git diff --quiet && git diff --staged --quiet; then
echo "没有需要提交的更改"
exit 0
fi
# 获取更改的文件用于提交信息
CHANGED=$(git status --short | head -5 | awk '{print $2}' | tr '\n' ', ')
git add .
git commit -m "自动备份:$CHANGED ($(date +%Y-%m-%d))"
git push 2>/dev/null || echo "推送失败(离线?)"
# 在新设备上
git clone git@github.com:username/clawdbot-config.git ~/.claude
# 拉取最新更改
cd ~/.claude && git pull
# 推送本地更改
cd ~/.claude && git add . && git commit -m "更新" && git push
# 同步到远程服务器
rsync -avz --delete \
~/.claude/ \
user@server:~/clawdbot-backup/
# 从远程服务器同步
rsync -avz --delete \
user@server:~/clawdbot-backup/ \
~/.claude/
# 备份到云文件夹(Dropbox, Google Drive 等)
CLOUD_DIR="$HOME/Dropbox/ClawdBot"
# 同步技能
rsync -avz ~/.claude/skills/ "$CLOUD_DIR/skills/"
rsync -avz ~/.claude/commands/ "$CLOUD_DIR/commands/"
# 复制设置
cp ~/.claude/settings.json "$CLOUD_DIR/"
#!/bin/bash
# sync-clawdbot.sh - 在设备间同步 ClawdBot 配置
SYNC_DIR="${CLAWDBOT_SYNC_DIR:-$HOME/Dropbox/ClawdBot}"
CLAUDE_DIR="$HOME/.claude"
sync_to_cloud() {
echo "正在同步到云端..."
mkdir -p "$SYNC_DIR"
rsync -avz --delete "$CLAUDE_DIR/skills/" "$SYNC_DIR/skills/"
rsync -avz --delete "$CLAUDE_DIR/commands/" "$SYNC_DIR/commands/"
rsync -avz "$CLAUDE_DIR/mcp/" "$SYNC_DIR/mcp/" 2>/dev/null
cp "$CLAUDE_DIR/settings.json" "$SYNC_DIR/" 2>/dev/null
echo "同步完成!"
}
sync_from_cloud() {
echo "正在从云端同步..."
rsync -avz "$SYNC_DIR/skills/" "$CLAUDE_DIR/skills/"
rsync -avz "$SYNC_DIR/commands/" "$CLAUDE_DIR/commands/"
rsync -avz "$SYNC_DIR/mcp/" "$CLAUDE_DIR/mcp/" 2>/dev/null
# 默认不覆盖本地设置
if [ ! -f "$CLAUDE_DIR/settings.json" ]; then
cp "$SYNC_DIR/settings.json" "$CLAUDE_DIR/" 2>/dev/null
fi
echo "同步完成!"
}
case "$1" in
push) sync_to_cloud ;;
pull) sync_from_cloud ;;
*)
echo "用法:$0 {push|pull}"
echo " push - 上传本地配置到云端"
echo " pull - 从云端下载配置到本地"
;;
esac
# 编辑 crontab
crontab -e
# 添加每日凌晨 2 点备份
0 2 * * * /home/user/.local/bin/clawdbot-backup backup full
# 添加每周日清理
0 3 * * 0 /home/user/.local/bin/clawdbot-backup cleanup
# 添加每 6 小时自动 Git 提交
0 */6 * * * cd ~/.claude && git add . && git commit -m "自动备份 $(date +\%Y-\%m-\%d)" && git push 2>/dev/null
```bash
cat > ~/.config/systemd/user/clawdbot-backup.service << 'EOF'
[Unit]
Description=ClawdBot 备份服务
[Service]
Type=oneshot
ExecStart=/home/user/.local/bin/clawdbot-backup backup full
EOF