实用脚本能自动备份浏览器书签吗?

wen 实用脚本 2

本文目录导读:

实用脚本能自动备份浏览器书签吗?

  1. 核心原理
  2. 方案一:Windows 系统 (PowerShell 脚本)
  3. 方案二:macOS / Linux 系统 (Bash 脚本)
  4. 方案三:通用跨平台 (Python 脚本)
  5. 进阶建议

可以的,通过脚本自动备份浏览器书签是一个很实用的需求,不同浏览器的书签文件位置和格式略有不同,但基本原理相似:找到书签文件 -> 复制到备份目录 -> 可选加入时间戳和压缩

下面提供几个针对不同场景的实用脚本,你可以根据自己的操作系统和浏览器选择。

核心原理

大多数主流浏览器(Chrome, Edge, Brave, Opera)都基于 Chromium 内核,它们会将书签保存在一个名为 Bookmarks 的 JSON 文件中(没有后缀名),Firefox 则使用 places.sqlite 数据库文件。

Windows 系统 (PowerShell 脚本)

此脚本适用于 Chrome、Edge、Brave 等 Chromium 内核浏览器。

功能:

  1. 自动定位当前用户的 Chrome 书签文件。
  2. 复制到 D:\BookmarkBackups 文件夹。
  3. 在文件名后添加当前日期(Bookmarks_2025-05-21.json)。
  4. 保留最近 30 天的备份,自动删除更早的。
# Windows_Backup_Bookmarks.ps1
# --- 配置区 ---
$sourcePath = "$env:LOCALAPPDATA\Google\Chrome\User Data\Default\Bookmarks"
$backupRoot = "D:\BookmarkBackups"
$retentionDays = 30
# --- 配置结束 ---
# 创建备份目录(如果不存在)
if (-not (Test-Path -Path $backupRoot)) {
    New-Item -ItemType Directory -Path $backupRoot | Out-Null
    Write-Host "已创建备份目录: $backupRoot" -ForegroundColor Green
}
# 检查源文件是否存在
if (-not (Test-Path -Path $sourcePath)) {
    Write-Host "错误:找不到 Chrome 书签文件!" -ForegroundColor Red
    Write-Host "路径: $sourcePath" -ForegroundColor Red
    exit 1
}
# 生成带时间戳的文件名
$timestamp = Get-Date -Format "yyyy-MM-dd_HHmmss"
$backupFileName = "Chrome_Bookmarks_$timestamp.json"
$backupFilePath = Join-Path -Path $backupRoot -ChildPath $backupFileName
# 执行复制
try {
    Copy-Item -Path $sourcePath -Destination $backupFilePath -Force
    Write-Host "书签备份成功!" -ForegroundColor Green
    Write-Host "备份文件: $backupFilePath" -ForegroundColor Cyan
} catch {
    Write-Host "书签备份失败!错误信息: $_" -ForegroundColor Red
    exit 1
}
# 清理旧备份(仅保留最近 N 天的)
$cutoffDate = (Get-Date).AddDays(-$retentionDays)
$oldBackups = Get-ChildItem -Path $backupRoot -Filter "*.json" | Where-Object {
    $_.CreationTime -lt $cutoffDate
}
foreach ($oldBackup in $oldBackups) {
    Remove-Item -Path $oldBackup.FullName -Force
    Write-Host "已删除旧备份: $($oldBackup.Name)" -ForegroundColor Yellow
}
Write-Host "备份完成,已保留最近 $retentionDays 天的记录。" -ForegroundColor Green

使用方法:

  1. 将代码保存为 backup_bookmarks.ps1
  2. 右键点击文件 -> “使用 PowerShell 运行”。
  3. (可选)在 Windows 任务计划程序中创建基本任务,设置为每天或每周自动执行。

macOS / Linux 系统 (Bash 脚本)

此脚本设计为跨平台,自动检测 macOS 和 Linux 下的常见浏览器。

功能:

  1. 自动检测 Chrome、Edge、Brave、Vivaldi、Opera、Firefox。
  2. 备份到 ~/BookmarkBackups 目录。
  3. 文件名包含浏览器名和日期(Chrome_Bookmarks_2025-05-21.json)。
  4. 自动压缩为 .tar.gz 格式节省空间。
  5. 只保留最近 14 天的备份。
#!/bin/bash
# Mac_Linux_Backup_Bookmarks.sh
# --- 配置区 ---
BACKUP_DIR="$HOME/BookmarkBackups"
RETENTION_DAYS=14
# --- 配置结束 ---
# 创建备份目录
mkdir -p "$BACKUP_DIR" 2>/dev/null
# 获取当前日期
DATE_STAMP=$(date +"%Y-%m-%d")
# 定义浏览器书签路径模式
declare -A BROWSERS=(
    ["Chrome"]="$HOME/Library/Application Support/Google/Chrome/Default/Bookmarks"
    ["Edge"]="$HOME/Library/Application Support/Microsoft Edge/Default/Bookmarks"
    ["Brave"]="$HOME/Library/Application Support/BraveSoftware/Brave-Browser/Default/Bookmarks"
    ["Firefox"]="$HOME/Library/Application Support/Firefox/Profiles/*.default*/places.sqlite"
)
# Linux 路径覆盖(如果在 Linux 下运行,自动修正路径)
if [[ "$(uname)" == "Linux" ]]; then
    BROWSERS=(
        ["Chrome"]="$HOME/.config/google-chrome/Default/Bookmarks"
        ["Edge"]="$HOME/.config/microsoft-edge/Default/Bookmarks"
        ["Brave"]="$HOME/.config/BraveSoftware/Brave-Browser/Default/Bookmarks"
        ["Firefox"]="$HOME/.mozilla/firefox/*.default*/places.sqlite"
    )
fi
backup_success=0
# 遍历所有浏览器
for browser in "${!BROWSERS[@]}"; do
    pattern="${BROWSERS[$browser]}"
    # 处理通配符(针对 Firefox 的随机 profile 名)
    for file in $pattern; do
        if [ -f "$file" ]; then
            # 确定文件扩展名
            ext="${file##*.}"
            if [ "$ext" == "sqlite" ]; then
                backup_name="${browser}_Bookmarks_${DATE_STAMP}.sqlite"
            else
                backup_name="${browser}_Bookmarks_${DATE_STAMP}.json"
            fi
            # 复制到临时位置
            cp "$file" "$BACKUP_DIR/$backup_name"
            # 压缩(节省空间)
            gzip -f "$BACKUP_DIR/$backup_name" 2>/dev/null
            echo "✅ $browser 书签备份完成:$BACKUP_DIR/${backup_name}.gz"
            backup_success=1
            break
        fi
    done
done
if [ $backup_success -eq 0 ]; then
    echo "⚠️ 未找到任何浏览器的书签文件。"
    echo "   请确认浏览器已安装并至少运行过一次。"
fi
# 清理旧备份
echo ""
echo "正在清理超过 $RETENTION_DAYS 天的旧备份..."
find "$BACKUP_DIR" -name "*.gz" -type f -mtime +$RETENTION_DAYS -delete
find "$BACKUP_DIR" -name "*.json" -type f -mtime +$RETENTION_DAYS -delete
find "$BACKUP_DIR" -name "*.sqlite" -type f -mtime +$RETENTION_DAYS -delete
echo "清理完成。"
exit 0

使用方法(macOS / Linux 终端):

  1. 将代码保存为 backup_bookmarks.sh
  2. 赋予执行权限:chmod +x backup_bookmarks.sh
  3. 运行:./backup_bookmarks.sh
  4. 自动定时执行:crontab -e 添加一行(例如每天中午12点运行): 0 12 * * * /full/path/to/backup_bookmarks.sh

通用跨平台 (Python 脚本)

如果你熟悉 Python,这是一个更优雅、跨平台且可扩展的方案。

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
通用浏览器书签备份脚本 (Python 3)
支持 Windows, macOS, Linux
"""
import os
import sys
import shutil
import datetime
import platform
import glob
import gzip
# --- 配置区 ---
BACKUP_DIR = os.path.expanduser("~/BookmarkBackups")
RETENTION_DAYS = 30
COMPRESS = True  # 是否压缩为 .gz
# --- 配置结束 ---
def get_browser_paths():
    """根据操作系统返回浏览器书签路径字典"""
    system = platform.system()
    home = os.path.expanduser("~")
    paths = {}
    if system == "Windows":
        local_appdata = os.environ.get("LOCALAPPDATA", os.path.join(home, "AppData", "Local"))
        paths = {
            "Chrome": os.path.join(local_appdata, "Google", "Chrome", "User Data", "Default", "Bookmarks"),
            "Edge": os.path.join(local_appdata, "Microsoft", "Edge", "User Data", "Default", "Bookmarks"),
            "Brave": os.path.join(local_appdata, "BraveSoftware", "Brave-Browser", "User Data", "Default", "Bookmarks"),
        }
    elif system == "Darwin":  # macOS
        app_support = os.path.join(home, "Library", "Application Support")
        paths = {
            "Chrome": os.path.join(app_support, "Google", "Chrome", "Default", "Bookmarks"),
            "Edge": os.path.join(app_support, "Microsoft Edge", "Default", "Bookmarks"),
            "Brave": os.path.join(app_support, "BraveSoftware", "Brave-Browser", "Default", "Bookmarks"),
            "Firefox": os.path.join(app_support, "Firefox", "Profiles"),
        }
    else:  # Linux
        config = os.path.join(home, ".config")
        paths = {
            "Chrome": os.path.join(config, "google-chrome", "Default", "Bookmarks"),
            "Edge": os.path.join(config, "microsoft-edge", "Default", "Bookmarks"),
            "Brave": os.path.join(config, "BraveSoftware", "Brave-Browser", "Default", "Bookmarks"),
            "Firefox": os.path.join(home, ".mozilla", "firefox"),
        }
    return paths, system
def find_firefox_profile(firefox_path):
    """查找 Firefox 的默认 profile 中的 places.sqlite"""
    if not os.path.isdir(firefox_path):
        return None
    # 查找所有以 .default 结尾的目录
    profiles = glob.glob(os.path.join(firefox_path, "*.default*"))
    for profile in profiles:
        places_file = os.path.join(profile, "places.sqlite")
        if os.path.isfile(places_file):
            return places_file
    return None
def backup_bookmarks():
    """主备份函数"""
    # 创建备份目录
    os.makedirs(BACKUP_DIR, exist_ok=True)
    paths, system = get_browser_paths()
    today = datetime.date.today().isoformat()
    backup_count = 0
    print(f"系统: {system}")
    print(f"备份目录: {BACKUP_DIR}")
    print(f"备份日期: {today}")
    print("-" * 50)
    for browser, path in paths.items():
        source_file = None
        if browser == "Firefox":
            if find_firefox_profile(path):
                source_file = find_firefox_profile(path)
            else:
                continue
        else:
            if os.path.isfile(path):
                source_file = path
        if not source_file:
            print(f"⚠️ {browser}: 未找到书签文件")
            continue
        # 构建备份文件名
        ext = os.path.splitext(source_file)[1] if browser == "Firefox" else ".json"
        backup_name = f"{browser}_Bookmarks_{today}{ext}"
        backup_path = os.path.join(BACKUP_DIR, backup_name)
        try:
            # 复制文件
            shutil.copy2(source_file, backup_path)
            # 如果启用了压缩
            if COMPRESS:
                with open(backup_path, 'rb') as f_in:
                    with gzip.open(backup_path + '.gz', 'wb') as f_out:
                        shutil.copyfileobj(f_in, f_out)
                os.remove(backup_path)  # 删除未压缩的副本
                print(f"✅ {browser}: 已压缩备份 -> {backup_name}.gz")
            else:
                print(f"✅ {browser}: 已备份 -> {backup_name}")
            backup_count += 1
        except Exception as e:
            print(f"❌ {browser}: 备份失败 -> {e}")
    # 清理旧备份
    if backup_count > 0:
        print("\n正在清理旧备份...")
        cutoff = datetime.datetime.now() - datetime.timedelta(days=RETENTION_DAYS)
        for filename in os.listdir(BACKUP_DIR):
            filepath = os.path.join(BACKUP_DIR, filename)
            if os.path.isfile(filepath):
                mtime = datetime.datetime.fromtimestamp(os.path.getmtime(filepath))
                if mtime < cutoff:
                    os.remove(filepath)
                    print(f"  已删除: {filename}")
        print("清理完成。")
    return backup_count
if __name__ == "__main__":
    backup_bookmarks()

使用方法:

  1. 保存为 backup_bookmarks.py
  2. 运行:python3 backup_bookmarks.py
  3. 自动化(以 Linux/macOS 为例)
    • crontab -e
    • 添加:0 12 * * 1 /usr/bin/python3 /path/to/backup_bookmarks.py (每周一中午12点运行)

进阶建议

  1. 存储到云端:备份目录可以设置到网盘同步目录(如 OneDrive、iCloud、Google Drive、Dropbox),实现异地备份。
  2. 增量备份 vs 全量备份:上述脚本都是全量备份,书签文件通常很小(几MB),全量备份完全足够,如果将来文件很大,可以考虑使用 rsyncgit 进行增量管理。
  3. 多用户 / 多设备
    • Windows:将 $env:LOCALAPPDATA 中的 Default 改为 Profile 1Profile 2 等即可支持 Chrome 多用户。
    • 将脚本部署在多台设备上,备份到同一个云同步文件夹即可集中管理。

直接复制 Bookmarks 文件是最简单有效的方法,建议使用 Python 脚本(方案三)获得最佳跨平台兼容性和可维护性,如果你更习惯终端操作,Bash 脚本(方案二)在 Mac/Linux 上非常高效,Windows 用户用 PowerShell(方案一)最省心。

抱歉,评论功能暂时关闭!