对指定目录下笔记排序脚本

官方不支持自定义排序下对某个目录中的笔记重新排序,而我正好有这个需求,就写了个简单的脚本,现分享出来供有同样需求的童鞋参考。希望加入节点排序和快速跳转功能 - 链滴 (ld246.com)

原理很简单,笔记目录下的 .siyuan/sort.json 文件记录着当前笔记的排序信息,脚本读取目标目录下的文档信息,按文档名排序后生成排序信息再写入到该文件中,保存前会进行备份,因为只动了 sort.json 文件,而这个文件只记录了排序信息,所以是安全的。

需要 python3 环境,默认按文档名称升序,如果需要降序,修改 reverseSort = True

可以在思源笔记中右键目标笔记 打开-打开文件位置,然后在资源管理器中复制目录路径作为参数传递给脚本,例如:

python3 siyuanSort.py /Users/Documents/SiYuan/学习笔记/data/20231109104801-lxukl1l/20231109152730-3z6jzts

注意:要先退出思源笔记后再执行脚本排序,防止冲突

import json
import os
import re
import shutil
import sys
import time

# 笔记所在目录
if len(sys.argv) == 2:
    targetDir = sys.argv[1]
else:
    print("缺少参数:文档目录")
    print(f"{sys.argv[0]} 待排序文档目录路径,如: /Users/Documents/SiYuan/学习笔记/data/20231109175954-au6a2mq")
    sys.exit()

# 默认按首字母由小到大排序,若希望由大到小,改为True
reverseSort = False

targetDir = targetDir.rstrip(os.sep)

subDirRE = re.compile(r'^.+[\/]\d{14}-\S{7}$')
noteDirRE = re.compile(r'^(.+[\/]data[\/]\d{14}-\S{7})(.*)')

noteDir = None

g = noteDirRE.match(targetDir)
if g:
    noteDir = g.group(1)
else:
    raise Exception("无法匹配出笔记目录!")

sortFile = os.path.join(noteDir, ".siyuan", "sort.json")

sortJson = json.load(open(sortFile, 'r', encoding="utf-8"))


class itemObject:
    def __init__(self, filePath) -> None:
        itemJson = json.load(open(filePath, 'r'))
        self.id = itemJson["Properties"]["id"]
        self.title = itemJson["Properties"]["title"]
        self.updatedTime = itemJson["Properties"]["updated"]
        self.sortid = sortJson.get(self.id, -1)
        print(filePath, self.id, self.title, self.sortid)
        subDir = filePath[:-3]
        if os.path.isdir(subDir) and subDirRE.match(subDir):
            self.subDir = subDir
            self.subDirObj = dirObject(subDir)
        else:
            self.subDir = None
            self.subDirObj = None


class dirObject:
    def __init__(self, dirPath) -> None:
        self.dirPath = dirPath
        self.itemDict = self.readDir()

    def readDir(self):
        itemDict = {}
        for name in os.listdir(self.dirPath):
            if name == ".DS_Store":
                continue
            itemPath = os.path.join(self.dirPath, name)
            if os.path.isfile(itemPath):
                if name.endswith(".sy"):
                    itemObj = itemObject(itemPath)
                    itemDict[itemObj.id] = itemObj
        return itemDict

    def sorted(self, reverse=False):
        print("sort dir:", self.dirPath)
        sortedItemID = sorted(self.itemDict.keys(), key=lambda x: self.itemDict[x].title, reverse=reverse)
        sortedIDDict = {itemID: idx + 1 for idx, itemID in enumerate(sortedItemID)}
        for _, itemObj in self.itemDict.items():
            itemObj.sortid = sortedIDDict[itemObj.id]


def sortDirObj(dirObj):
    if dirObj.dirPath == targetDir:
        dirObj.sorted(reverseSort)
    else:
        for _, itemObj in dirObj.itemDict.items():
            if itemObj.subDir is not None:
                if itemObj.subDir == targetDir:
                    itemObj.subDirObj.sorted(reverseSort)
                else:
                    sortDirObj(itemObj.subDirObj)


def saveSortID(dirObj, sortDict):
    for _, itemObj in dirObj.itemDict.items():
        if itemObj.sortid > 0:
            sortDict[itemObj.id] = itemObj.sortid
        if itemObj.subDirObj is not None:
            saveSortID(itemObj.subDirObj, sortDict)


if __name__ == "__main__":

    dirObj = dirObject(noteDir)

    sortDirObj(dirObj)

    sortJsonNew = {}

    saveSortID(dirObj, sortJsonNew)

    print(json.dumps(sortJsonNew))

    shutil.move(sortFile, f"{sortFile}.{int(time.time())}")

    with open(sortFile, 'w', encoding="utf-8") as fw:
        fw.write(json.dumps(sortJsonNew))

  • 思源笔记

    思源笔记是一款隐私优先的个人知识管理系统,支持完全离线使用,同时也支持端到端加密同步。

    融合块、大纲和双向链接,重构你的思维。

    18778 引用 • 70211 回帖

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...

推荐标签 标签

  • Caddy

    Caddy 是一款默认自动启用 HTTPS 的 HTTP/2 Web 服务器。

    10 引用 • 54 回帖 • 128 关注
  • 互联网

    互联网(Internet),又称网际网络,或音译因特网、英特网。互联网始于 1969 年美国的阿帕网,是网络与网络之间所串连成的庞大网络,这些网络以一组通用的协议相连,形成逻辑上的单一巨大国际网络。

    96 引用 • 330 回帖
  • C

    C 语言是一门通用计算机编程语言,应用广泛。C 语言的设计目标是提供一种能以简易的方式编译、处理低级存储器、产生少量的机器码以及不需要任何运行环境支持便能运行的编程语言。

    83 引用 • 165 回帖 • 40 关注
  • Webswing

    Webswing 是一个能将任何 Swing 应用通过纯 HTML5 运行在浏览器中的 Web 服务器,详细介绍请看 将 Java Swing 应用变成 Web 应用

    1 引用 • 15 回帖 • 635 关注
  • WebClipper

    Web Clipper 是一款浏览器剪藏扩展,它可以帮助你把网页内容剪藏到本地。

    3 引用 • 9 回帖 • 5 关注
  • 分享

    有什么新发现就分享给大家吧!

    242 引用 • 1750 回帖
  • PWA

    PWA(Progressive Web App)是 Google 在 2015 年提出、2016 年 6 月开始推广的项目。它结合了一系列现代 Web 技术,在网页应用中实现和原生应用相近的用户体验。

    14 引用 • 69 回帖 • 131 关注
  • Ngui

    Ngui 是一个 GUI 的排版显示引擎和跨平台的 GUI 应用程序开发框架,基于
    Node.js / OpenGL。目标是在此基础上开发 GUI 应用程序可拥有开发 WEB 应用般简单与速度同时兼顾 Native 应用程序的性能与体验。

    7 引用 • 9 回帖 • 345 关注
  • 星云链

    星云链是一个开源公链,业内简单的将其称为区块链上的谷歌。其实它不仅仅是区块链搜索引擎,一个公链的所有功能,它基本都有,比如你可以用它来开发部署你的去中心化的 APP,你可以在上面编写智能合约,发送交易等等。3 分钟快速接入星云链 (NAS) 测试网

    3 引用 • 16 回帖
  • QQ

    1999 年 2 月腾讯正式推出“腾讯 QQ”,在线用户由 1999 年的 2 人(马化腾和张志东)到现在已经发展到上亿用户了,在线人数超过一亿,是目前使用最广泛的聊天软件之一。

    45 引用 • 557 回帖 • 219 关注
  • Solidity

    Solidity 是一种智能合约高级语言,运行在 [以太坊] 虚拟机(EVM)之上。它的语法接近于 JavaScript,是一种面向对象的语言。

    3 引用 • 18 回帖 • 350 关注
  • jsDelivr

    jsDelivr 是一个开源的 CDN 服务,可为 npm 包、GitHub 仓库提供免费、快速并且可靠的全球 CDN 加速服务。

    5 引用 • 31 回帖 • 45 关注
  • IPFS

    IPFS(InterPlanetary File System,星际文件系统)是永久的、去中心化保存和共享文件的方法,这是一种内容可寻址、版本化、点对点超媒体的分布式协议。请浏览 IPFS 入门笔记了解更多细节。

    20 引用 • 245 回帖 • 230 关注
  • Git

    Git 是 Linux Torvalds 为了帮助管理 Linux 内核开发而开发的一个开放源码的版本控制软件。

    205 引用 • 357 回帖 • 1 关注
  • 锤子科技

    锤子科技(Smartisan)成立于 2012 年 5 月,是一家制造移动互联网终端设备的公司,公司的使命是用完美主义的工匠精神,打造用户体验一流的数码消费类产品(智能手机为主),改善人们的生活质量。

    4 引用 • 31 回帖 • 9 关注
  • sts
    2 引用 • 2 回帖 • 152 关注
  • Jenkins

    Jenkins 是一套开源的持续集成工具。它提供了非常丰富的插件,让构建、部署、自动化集成项目变得简单易用。

    51 引用 • 37 回帖
  • B3log

    B3log 是一个开源组织,名字来源于“Bulletin Board Blog”缩写,目标是将独立博客与论坛结合,形成一种新的网络社区体验,详细请看 B3log 构思。目前 B3log 已经开源了多款产品:SymSoloVditor思源笔记

    1083 引用 • 3461 回帖 • 286 关注
  • Electron

    Electron 基于 Chromium 和 Node.js,让你可以使用 HTML、CSS 和 JavaScript 构建应用。它是一个由 GitHub 及众多贡献者组成的活跃社区共同维护的开源项目,兼容 Mac、Windows 和 Linux,它构建的应用可在这三个操作系统上面运行。

    15 引用 • 136 回帖 • 5 关注
  • 酷鸟浏览器

    安全 · 稳定 · 快速
    为跨境从业人员提供专业的跨境浏览器

    3 引用 • 59 回帖 • 22 关注
  • Ruby

    Ruby 是一种开源的面向对象程序设计的服务器端脚本语言,在 20 世纪 90 年代中期由日本的松本行弘(まつもとゆきひろ/Yukihiro Matsumoto)设计并开发。在 Ruby 社区,松本也被称为马茨(Matz)。

    7 引用 • 31 回帖 • 177 关注
  • Quicker

    Quicker 您的指尖工具箱!操作更少,收获更多!

    21 引用 • 74 回帖
  • 黑曜石

    黑曜石是一款强大的知识库工具,支持本地 Markdown 文件编辑,支持双向链接和关系图。

    A second brain, for you, forever.

    10 引用 • 85 回帖
  • JSON

    JSON (JavaScript Object Notation)是一种轻量级的数据交换格式。易于人类阅读和编写。同时也易于机器解析和生成。

    51 引用 • 190 回帖 • 1 关注
  • CloudFoundry

    Cloud Foundry 是 VMware 推出的业界第一个开源 PaaS 云平台,它支持多种框架、语言、运行时环境、云平台及应用服务,使开发人员能够在几秒钟内进行应用程序的部署和扩展,无需担心任何基础架构的问题。

    5 引用 • 18 回帖 • 154 关注
  • 宕机

    宕机,多指一些网站、游戏、网络应用等服务器一种区别于正常运行的状态,也叫“Down 机”、“当机”或“死机”。宕机状态不仅仅是指服务器“挂掉了”、“死机了”状态,也包括服务器假死、停用、关闭等一些原因而导致出现的不能够正常运行的状态。

    13 引用 • 82 回帖 • 36 关注
  • Redis

    Redis 是一个开源的使用 ANSI C 语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value 数据库,并提供多种语言的 API。从 2010 年 3 月 15 日起,Redis 的开发工作由 VMware 主持。从 2013 年 5 月开始,Redis 的开发由 Pivotal 赞助。

    284 引用 • 247 回帖 • 173 关注