强曰为道
与天地相似,故不违。知周乎万物,而道济天下,故不过。旁行而不流,乐天知命,故不忧.
文档目录

Buku 书签管理完全指南 / 第 05 章:标签管理

第 05 章:标签管理

掌握 Buku 的标签系统,包括自动标签、层级标签、标签搜索和批量操作。

5.1 标签基础

Buku 标签格式

Buku 使用独特的标签格式:所有标签以逗号分隔,且整个标签字符串的首尾都带有逗号。

标签存储格式:,tag1,tag2,tag3,

示例:
,bookmark,cli,python,open-source,
,tutorial,web,javascript,frontend,
,research,ai,machine-learning,

标签命名规范

# ✅ 正确的标签格式
buku -a https://example.com "标题" ,python,tutorial,beginner
buku -a https://example.com "标题" ,web-dev,frontend,react
buku -a https://example.com "标题" ,2024/review,favorite

# ⚠️ 注意事项
# 1. 标签不区分大小写
buku -a https://example.com "标题" ,Python    # 存储为 python
buku -a https://example.com "标题" ,PYTHON    # 存储为 python

# 2. 标签中的空格会被保留
buku -a https://example.com "标题" ,web dev    # 标签为 "web dev"
buku -a https://example.com "标题" ,web-dev    # 标签为 "web-dev"(推荐)

# 3. 标签支持 Unicode 字符
buku -a https://example.com "标题" ,编程,教程,入门

查看所有标签

# 列出所有标签及其使用次数
buku --stag

# 输出示例:
# 15 python
# 12 tutorial
#  8 web
#  6 javascript
#  5 reference
#  3 bookmark
#  2 cli

# 仅列出标签名称
buku --stag | awk '{print $2}'

# 统计标签总数
buku --stag | wc -l

5.2 标签操作

添加标签

# 添加书签时指定标签
buku -a https://example.com "标题" ,tag1,tag2,tag3

# 为现有书签添加标签
buku -u 1 + ,newtag              # 添加单个标签
buku -u 1 + ,tag1,tag2           # 添加多个标签

# 批量添加标签
for id in 1 3 5 7; do
    buku -u "$id" + ,reviewed
done

删除标签

# 从书签中删除标签
buku -u 1 - ,oldtag              # 删除单个标签
buku -u 1 - ,tag1,tag2           # 删除多个标签

# 清除书签的所有标签
buku -u 1 ,

# 批量删除标签
for id in $(buku -s ,deprecated | grep "^[0-9]" | awk '{print $1}' | tr -d '.'); do
    buku -u "$id" - ,deprecated
done

替换标签

# 替换书签的所有标签(删除旧标签,设置新标签)
buku -u 1 ,newtag1,newtag2

# 注意:这会清除所有现有标签,仅保留新标签
# 如果只是想修改某个标签,请使用 + 和 - 操作组合

重命名标签(全局)

# 全局重命名标签
buku --stag oldname newname

# 示例:将 "js" 重命名为 "javascript"
buku --stag js javascript

# 重命名后,所有包含 "js" 标签的书签都会被更新

删除标签(全局)

# 从所有书签中删除特定标签
buku --stag oldname

# 示例:删除 "deprecated" 标签
buku --stag deprecated

# ⚠️ 注意:这会从所有书签中移除该标签

5.3 自动标签

自动标签功能概述

Buku 支持基于 URL 模式的自动标签功能,可以在添加书签时自动应用预定义的标签。

# 自动标签配置文件位置
~/.config/buku/auto_tag

# 文件格式:每行一个规则
# URL 模式  标签列表
# 使用空格或制表符分隔

配置自动标签

# 创建自动标签配置
mkdir -p ~/.config/buku
cat > ~/.config/buku/auto_tag << 'EOF'
github.com ,github,code,git
stackoverflow.com ,stackoverflow,programming,q&a
docs.python.org ,python,doc,reference
developer.mozilla.org ,mdn,web,reference,documentation
arxiv.org ,research,paper,academic
youtube.com ,video,tutorial
medium.com ,article,blog
news.ycombinator.com ,news,tech,hacker-news
reddit.com ,social,community
gitlab.com ,gitlab,code,git
EOF

自动标签的使用

# 添加包含自动标签匹配域名的书签
buku -a https://github.com/jarun/buku "Buku 项目"
# 自动应用标签:,github,code,git,bookmark

# 手动标签与自动标签合并
buku -a https://github.com/jarun/buku "Buku 项目" ,python,cli
# 最终标签:,github,code,git,bookmark,python,cli

# 查看自动标签配置
cat ~/.config/buku/auto_tag

自动标签规则语法

# 规则格式:
# <URL 模式> <标签列表>
#
# URL 模式:
# - 支持通配符 *
# - 支持正则表达式(以 / 开头)
#
# 标签列表:
# - 以逗号开头
# - 多个标签用逗号分隔
# - 结尾无逗号

# 示例规则:
github.com ,github,code
*.github.io ,github-pages,blog
docs.*.org ,documentation
/arxiv\.org\/abs/ ,research,paper

高级自动标签规则

cat > ~/.config/buku/auto_tag << 'EOF'
# GitHub 相关
github.com ,github,code,git
*.github.io ,github-pages,blog,portfolio
gist.github.com ,github,gist,snippet

# 文档站点
docs.python.org ,python,doc,reference
doc.rust-lang.org ,rust,doc,reference
go.dev/doc ,golang,doc,reference
developer.mozilla.org ,mdn,web,reference
docs.microsoft.com ,microsoft,doc

# 学习资源
coursera.org ,course,online-learning
udemy.com ,course,online-learning
khanacademy.org ,course,online-learning
freecodecamp.org ,tutorial,programming,free

# 技术社区
stackoverflow.com ,stackoverflow,programming,q&a
news.ycombinator.com ,news,tech,hacker-news
reddit.com/r/programming ,reddit,programming
dev.to ,blog,programming,community
medium.com ,article,blog

# 学术资源
arxiv.org ,research,paper,academic
scholar.google.com ,research,academic,search
ieee.org ,research,paper,ieee
acm.org ,research,paper,acm

# 工具和服务
notion.so ,tool,productivity,notes
trello.com ,tool,project-management
figma.com ,tool,design,ui
EOF

5.4 层级标签

层级标签概念

虽然 Buku 原生不支持层级标签(如文件夹结构),但可以通过命名约定实现类似效果。

层级标签命名约定:
<大类>/<子类>/<具体标签>

示例:
,tech/python/web/django,
,tech/python/web/flask,
,tech/python/ml/tensorflow,
,tech/rust/web/actix,
,lang/zh/mandarin,
,lang/en/business,
,project/website/blog,
,project/api/rest,

使用层级标签

# 添加带层级标签的书签
buku -a https://djangoproject.com "Django" ,tech/python/web/django
buku -a https://flask.palletsprojects.com "Flask" ,tech/python/web/flask
buku -a https://www.tensorflow.org "TensorFlow" ,tech/python/ml/tensorflow

# 搜索大类
buku -s ,tech
# 结果: 匹配所有 tech 开头的标签

# 搜索子类
buku -s ,tech/python
# 结果: 匹配所有 tech/python 开头的标签

# 搜索具体标签
buku -s ,tech/python/web
# 结果: 匹配所有 tech/python/web 的书签

# 搜索特定技术
buku -s ,tech/python/web/django
# 结果: 仅匹配 Django 相关书签

层级标签的优势

┌────────────────────────────────────────────────────────────┐
│                    层级标签示意结构                          │
├────────────────────────────────────────────────────────────┤
│                                                            │
│  tech/                                                      │
│  ├── python/                                                │
│  │   ├── web/                                               │
│  │   │   ├── django                                         │
│  │   │   ├── flask                                          │
│  │   │   └── fastapi                                        │
│  │   ├── ml/                                                │
│  │   │   ├── tensorflow                                     │
│  │   │   ├── pytorch                                        │
│  │   │   └── scikit-learn                                   │
│  │   └── tools/                                             │
│  │       ├── pytest                                         │
│  │       └── black                                          │
│  ├── rust/                                                  │
│  │   ├── web/                                               │
│  │   │   └── actix                                          │
│  │   └── systems/                                           │
│  │       └── tokio                                          │
│  └── javascript/                                            │
│      ├── frontend/                                          │
│      │   ├── react                                          │
│      │   └── vue                                            │
│      └── backend/                                           │
│          └── node                                           │
│                                                            │
│  优点:                                                      │
│  - 支持任意深度的层级结构                                     │
│  - 搜索父级自动包含所有子级                                   │
│  - 兼容 Buku 的标签搜索机制                                   │
│  - 便于快速浏览和分类管理                                     │
└────────────────────────────────────────────────────────────┘

层级标签最佳实践

# 1. 保持层级一致性
# ✅ 推荐:统一使用 3-4 级
,tech/python/web/django,
,tech/rust/systems/tokio,

# ❌ 不推荐:层级不一致
,tech/python/django,       # 3 级
,tech/rust/web/backend/actix,  # 5 级

# 2. 使用简洁的标签名
# ✅ 推荐
,tech/python/web/django,
# ❌ 不推荐
,technology/python-programming/web-development/django-framework,

# 3. 避免过深的层级
# ✅ 推荐:最多 4 级
,tech/python/web/django,
# ❌ 不推荐:超过 4 级
,tech/python/web/backend/django/rest-framework/serializers,

5.5 批量标签操作

批量添加标签

# 为搜索结果添加标签
# 方法一:循环处理
buku -s python | grep "^[0-9]" | awk '{print $1}' | tr -d '.' | while read id; do
    buku -u "$id" + ,programming
done

# 方法二:使用 xargs
buku -j -s python | jq -r '.[].id' | xargs -I {} buku -u {} + ,programming

# 为特定范围的书签添加标签
for id in $(seq 1 100); do
    buku -u "$id" + ,legacy 2>/dev/null
done

批量删除标签

# 从所有书签中删除特定标签
buku --stag deprecated

# 从搜索结果中删除标签
buku -s ,old-tag | grep "^[0-9]" | awk '{print $1}' | tr -d '.' | while read id; do
    buku -u "$id" - ,old-tag
done

批量重命名标签

# 使用 Buku 内置功能
buku --stag old-name new-name

# 或使用脚本进行更复杂的重命名
# 例如:将 "python3" 和 "py3" 都统一为 "python"
buku --stag python3 python
buku --stag py3 python

批量标签清理脚本

#!/bin/bash
# cleanup_tags.sh - 清理和标准化标签

echo "=== 标签清理工具 ==="
echo ""

# 1. 显示所有标签及使用次数
echo "当前标签列表:"
buku --stag
echo ""

# 2. 合并相似标签
echo "合并相似标签..."
buku --stag js javascript 2>/dev/null
buku --stag py python 2>/dev/null
buku --stag rb ruby 2>/dev/null
buku --stag golang go 2>/dev/null

# 3. 删除空标签(如果存在)
# Buku 通常不会创建空标签,但可以检查

# 4. 显示清理后的标签
echo ""
echo "清理后的标签列表:"
buku --stag

echo ""
echo "清理完成!"

5.6 标签策略

推荐标签分类体系

┌────────────────────────────────────────────────────────────┐
│                  推荐标签分类体系                             │
├────────────────────────────────────────────────────────────┤
│                                                            │
│  📂 主题分类                                                │
│  ├── tech        技术相关                                   │
│  ├── science     科学                                       │
│  ├── business    商业                                       │
│  ├── art         艺术                                       │
│  └── news        新闻                                       │
│                                                            │
│  🔧 技术栈                                                  │
│  ├── python, javascript, rust, go, java, c++               │
│  ├── react, vue, angular, svelte                            │
│  ├── django, flask, fastapi, express                        │
│  ├── postgresql, mysql, mongodb, redis                      │
│  └── docker, kubernetes, aws, gcp, azure                    │
│                                                            │
│  📋 用途标记                                                │
│  ├── reference    参考文档                                   │
│  ├── tutorial     教程                                      │
│  ├── tool         工具                                      │
│  ├── library      库/框架                                   │
│  ├── article      文章                                      │
│  ├── video        视频                                      │
│  └── paper        学术论文                                   │
│                                                            │
│  ⏰ 状态标记                                                │
│  ├── toread       待阅读                                    │
│  ├── reading      阅读中                                    │
│  ├── read         已阅读                                    │
│  ├── favorite     收藏                                      │
│  ├── archived     已归档                                    │
│  └── starred      星标                                      │
│                                                            │
│  📅 时间标记                                                │
│  ├── 2024, 2025, 2026    年份                               │
│  └── q1, q2, q3, q4      季度                               │
│                                                            │
│  🏢 来源标记                                                │
│  ├── github, gitlab      代码托管                           │
│  ├── medium, dev.to      博客平台                           │
│  ├── stackoverflow       问答社区                           │
│  └── arxiv               学术平台                           │
│                                                            │
└────────────────────────────────────────────────────────────┘

标签命名约定

类别 命名格式 示例
编程语言 小写全称 python, javascript, rust
框架 小写全称 django, react, flask
工具 小写全称 docker, git, vim
文档类型 小写英文 doc, tutorial, reference
状态 小写英文 toread, archived, favorite
层级 斜杠分隔 tech/python/web/django

标签数量建议

# 每个书签建议标签数量:3-7 个
# ✅ 推荐
buku -a URL "标题" ,python,web,tutorial,reference

# ❌ 不推荐:标签过多
buku -a URL "标题" ,python,programming,language,code,web,tutorial,beginner,2024,useful

# ❌ 不推荐:标签过少
buku -a URL "标题" ,bookmark

5.7 标签统计与分析

标签使用统计

#!/bin/bash
# tag_analysis.sh - 标签使用分析

echo "=== Buku 标签分析报告 ==="
echo ""

# 总书签数
total=$(buku -p | grep -c "^[0-9]")
echo "总书签数: $total"
echo ""

# 标签统计
echo "标签使用排行 (Top 20):"
echo "----------------------"
buku --stag | head -20

echo ""

# 无标签书签数
untagged=$(buku -j | jq '[.[] | select(.tags == "," or .tags == "")] | length')
echo "无标签书签: $untagged"

# 标签种类数
tag_count=$(buku --stag | wc -l)
echo "标签种类数: $tag_count"

# 平均每书签标签数
avg_tags=$(buku -j | jq '[.[] | .tags | split(",") | length - 2] | add / length')
echo "平均标签数: $avg_tags"

可视化标签分布

#!/bin/bash
# tag_distribution.sh - 标签分布可视化

echo "=== 标签分布图 ==="
echo ""

buku --stag | while read count tag; do
    bar=$(printf '%*s' "$count" '' | tr ' ' '█')
    printf "%-20s %s (%d)\n" "$tag" "$bar" "$count"
done | sort -t'(' -k2 -rn | head -30

5.8 常见标签操作速查

操作 命令 示例
查看所有标签 buku --stag 显示标签列表及计数
添加标签 buku -u ID + ,tag buku -u 1 + ,python
删除标签 buku -u ID - ,tag buku -u 1 - ,old
替换标签 buku -u ID ,tags buku -u 1 ,new1,new2
全局重命名 buku --stag old new buku --stag js javascript
全局删除 buku --stag tag buku --stag deprecated
标签搜索 buku -s ,tag buku -s ,python
精确标签搜索 buku -st ,tag buku -st ,python
排除标签 buku -s kw -x ,tag buku -s py -x ,old

5.9 本章小结

要点 说明
标签格式 以逗号开头,逗号分隔,首尾带逗号
自动标签 通过 ~/.config/buku/auto_tag 配置 URL 模式匹配
层级标签 使用斜杠分隔实现层级结构,如 tech/python/web
批量操作 buku --stag 进行全局标签操作
标签策略 建议每书签 3-7 个标签,保持一致性

扩展阅读


下一章第 06 章:导入导出 — 学习在不同格式和平台之间迁移书签数据。