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

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 + ,tagbuku -u 1 + ,python
删除标签buku -u ID - ,tagbuku -u 1 - ,old
替换标签buku -u ID ,tagsbuku -u 1 ,new1,new2
全局重命名buku --stag old newbuku --stag js javascript
全局删除buku --stag tagbuku --stag deprecated
标签搜索buku -s ,tagbuku -s ,python
精确标签搜索buku -st ,tagbuku -st ,python
排除标签buku -s kw -x ,tagbuku -s py -x ,old

5.9 本章小结

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

扩展阅读


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