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

本贴最后更新于 372 天前,其中的信息可能已经时移俗易

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

  • 思源笔记

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

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

    22350 引用 • 89424 回帖 • 1 关注

相关帖子

欢迎来到这里!

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

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

推荐标签 标签

  • 周末

    星期六到星期天晚,实行五天工作制后,指每周的最后两天。再过几年可能就是三天了。

    14 引用 • 297 回帖 • 1 关注
  • GAE

    Google App Engine(GAE)是 Google 管理的数据中心中用于 WEB 应用程序的开发和托管的平台。2008 年 4 月 发布第一个测试版本。目前支持 Python、Java 和 Go 开发部署。全球已有数十万的开发者在其上开发了众多的应用。

    14 引用 • 42 回帖 • 764 关注
  • OkHttp

    OkHttp 是一款 HTTP & HTTP/2 客户端库,专为 Android 和 Java 应用打造。

    16 引用 • 6 回帖 • 62 关注
  • ngrok

    ngrok 是一个反向代理,通过在公共的端点和本地运行的 Web 服务器之间建立一个安全的通道。

    7 引用 • 63 回帖 • 624 关注
  • 音乐

    你听到信仰的声音了么?

    60 引用 • 511 回帖 • 1 关注
  • Lute

    Lute 是一款结构化的 Markdown 引擎,支持 Go 和 JavaScript。

    25 引用 • 191 回帖 • 16 关注
  • 服务器

    服务器,也称伺服器,是提供计算服务的设备。由于服务器需要响应服务请求,并进行处理,因此一般来说服务器应具备承担服务并且保障服务的能力。

    125 引用 • 588 回帖
  • 自由行
    10 关注
  • Hibernate

    Hibernate 是一个开放源代码的对象关系映射框架,它对 JDBC 进行了非常轻量级的对象封装,使得 Java 程序员可以随心所欲的使用对象编程思维来操纵数据库。

    39 引用 • 103 回帖 • 709 关注
  • 服务

    提供一个服务绝不仅仅是简单的把硬件和软件累加在一起,它包括了服务的可靠性、服务的标准化、以及对服务的监控、维护、技术支持等。

    41 引用 • 24 回帖 • 2 关注
  • BAE

    百度应用引擎(Baidu App Engine)提供了 PHP、Java、Python 的执行环境,以及云存储、消息服务、云数据库等全面的云服务。它可以让开发者实现自动地部署和管理应用,并且提供动态扩容和负载均衡的运行环境,让开发者不用考虑高成本的运维工作,只需专注于业务逻辑,大大降低了开发者学习和迁移的成本。

    19 引用 • 75 回帖 • 641 关注
  • Android

    Android 是一种以 Linux 为基础的开放源码操作系统,主要使用于便携设备。2005 年由 Google 收购注资,并拉拢多家制造商组成开放手机联盟开发改良,逐渐扩展到到平板电脑及其他领域上。

    334 引用 • 323 回帖 • 2 关注
  • InfluxDB

    InfluxDB 是一个开源的没有外部依赖的时间序列数据库。适用于记录度量,事件及实时分析。

    2 引用 • 72 关注
  • Maven

    Maven 是基于项目对象模型(POM)、通过一小段描述信息来管理项目的构建、报告和文档的软件项目管理工具。

    186 引用 • 318 回帖 • 304 关注
  • 资讯

    资讯是用户因为及时地获得它并利用它而能够在相对短的时间内给自己带来价值的信息,资讯有时效性和地域性。

    55 引用 • 85 回帖 • 1 关注
  • 职场

    找到自己的位置,萌新烦恼少。

    127 引用 • 1705 回帖
  • QQ

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

    45 引用 • 557 回帖 • 67 关注
  • Netty

    Netty 是一个基于 NIO 的客户端-服务器编程框架,使用 Netty 可以让你快速、简单地开发出一个可维护、高性能的网络应用,例如实现了某种协议的客户、服务端应用。

    49 引用 • 33 回帖 • 21 关注
  • Git

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

    209 引用 • 358 回帖 • 2 关注
  • 心情

    心是产生任何想法的源泉,心本体会陷入到对自己本体不能理解的状态中,因为心能产生任何想法,不能分出对错,不能分出自己。

    59 引用 • 369 回帖
  • 知乎

    知乎是网络问答社区,连接各行各业的用户。用户分享着彼此的知识、经验和见解,为中文互联网源源不断地提供多种多样的信息。

    10 引用 • 66 回帖
  • SendCloud

    SendCloud 由搜狐武汉研发中心孵化的项目,是致力于为开发者提供高质量的触发邮件服务的云端邮件发送平台,为开发者提供便利的 API 接口来调用服务,让邮件准确迅速到达用户收件箱并获得强大的追踪数据。

    2 引用 • 8 回帖 • 483 关注
  • SQLite

    SQLite 是一个进程内的库,实现了自给自足的、无服务器的、零配置的、事务性的 SQL 数据库引擎。SQLite 是全世界使用最为广泛的数据库引擎。

    5 引用 • 7 回帖
  • V2Ray
    1 引用 • 15 回帖 • 1 关注
  • GraphQL

    GraphQL 是一个用于 API 的查询语言,是一个使用基于类型系统来执行查询的服务端运行时(类型系统由你的数据定义)。GraphQL 并没有和任何特定数据库或者存储引擎绑定,而是依靠你现有的代码和数据支撑。

    4 引用 • 3 回帖 • 9 关注
  • 深度学习

    深度学习(Deep Learning)是机器学习的分支,是一种试图使用包含复杂结构或由多重非线性变换构成的多个处理层对数据进行高层抽象的算法。

    53 引用 • 40 回帖 • 1 关注
  • Hadoop

    Hadoop 是由 Apache 基金会所开发的一个分布式系统基础架构。用户可以在不了解分布式底层细节的情况下,开发分布式程序。充分利用集群的威力进行高速运算和存储。

    86 引用 • 122 回帖 • 625 关注