知识管理、文件(标签)管理的一种尝试 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
爱意满满的作品展示区。
SuperMild
5.49D
V2EX    分享创造

知识管理、文件(标签)管理的一种尝试

  •  
  •   SuperMild
    ahui2016 2018-08-09 10:46:55 +08:00 5443 次点击
    这是一个创建于 2673 天前的主题,其中的信息可能已经有所发展或是发生改变。

    一般来说,一个知识管理系统可以考虑的方案主要有以下几种:

    1. 全部数据进数据库,每次需要使用的时候再从数据库中读出,通过软件界面呈现给用户。
    2. 文件保留在文件系统中,只把与文件一一对应的标签、描述、评星等数据保存在数据库中。
    3. 不使用数据库,而是生成一个与文件对应的描述文件,在该描述文件中记录对应文件的标签、描述、评星等数据。

    第 1 种方案最常见,比如 Evernote, OneNote 等都采用这种方案,这种方案自然有很多优点,但也有一个明显缺点:无法与其他软件合作。比如,如果用 Evernote 来储存图片,就无法用看图软件直接看图,也无法用修图软件直接修图。

    第 2 种方案也能偶尔见到,一般懂编程的人自己想写一个软件来管理本地文件,很可能采用这个方案。

    我现在就是想做一个本地的 文件管理工具, 具体来说就是文件的标签管理工具。本该采用第 2 种方案,但是我突发奇想,能不能采用最容易被否定的第 3 种方案?

    第 3 种方案由于会产生大量小文件,因此被人讨厌。但当我真的去把它做出来的时候,经过试用,发现它也有很多好处啊!

    多仓库共存

    • 采用第 1 种、第 2 种方案时,通常一台电脑里只能有一个账号(或仓库),但我采用第 3 种方案后,发现多仓库共存变得非常容易。
    • 比如,用户可能希望把工作和生活分开,建立各自独立的仓库。
    • 也可能希望对一类文件单独建立仓库,比如全部自己拍的照片一个仓库,除此之外的其他文件一个通用仓库。
    • 由于现在很多人使用笔记本电脑,硬盘容量有限,于是很可能希望在电脑硬盘里建立一个小仓库,在移动硬盘里建立一个大仓库,定期把小仓库的文件移动到大仓库里。

    在不同的仓库之间交流时,不需要导入导出。

    • 如果使用 Evernote, 如果你想把一份笔记发给朋友,或者你自己有两个账号,想把其中一个账号的笔记移动到另一个账号里,那就需要先导出笔记,再导入笔记。
    • 而采用第 3 种方案就很方便了,直接复制或剪切即可。
    • 比如上面“多仓库共存”里所述的最后一种情况,把小仓库的东西移到大仓库里的情况,采用第 3 种方案就非常非常方便,直接移动文件即可。

    随意移动文件位置,文件夹随意改名。

    • 第 2 种方案有一个缺点,移动文件位置、文件夹改名、文件改名都需要在软件界面里进行,因为它的数据库必须对应文件位置和文件名,一旦移动,就对应不上了。
    • 而第 3 种方案,信息都在“描述文件”里,只要移动文件的时候把描述文件一起移动即可,信息与文件位置无关。
    • 实际使用中,我发现移动文件位置和文件夹改名是很频繁发生的操作,这导致第 2 种方案很不方便。

    局部备份到网盘

    • 如果采用第 2 种方案,局部备份到网盘将是一个很麻烦的任务,因为标签等信息都在数据库里,与文件是分离的,如果只上传一部分文件到网盘,文件位置(目录)可能发生变化,数据库就对应不上。
    • 而如果采用第 3 种方案,那就非常轻松、简单了,完全不受文件位置(目录)的影响,网盘那边随便建一个文件夹即可,只要连同描述文件一起,就可以心情轻松地上传, 重点:信息全在描述文件里! 不需要备份数据库,不需要管文件位置。

    容易定制,容易扩展

    • 我根据上述的理念,写了一堆处理描述文件的脚本程序,但我没有把它们整合为一个大而全的软件。
    • 虽然我写了一堆程序,有 GUI 界面,可以对文件添加标签、修改标签,对标签进行一些简单管理。但说做了一个软件却不太准确,因为这套东西甚至没有一个固定的形态。
    • 比如我这套东西里面最最核心,最重要的就是那个所谓的“描述文件”,是一个 json 文件,但就连它都是可以随意定制的。
    • 准确来说,我是考虑到上面所述很少人采用的第 3 种方案的优点,做了一个尝试和示范,结果发现还蛮好用的。
    • 由于这个理念本身非常简单,就是处理 json 文件而已,任何编程语言,最基本的编程知识就能做到,因此如果你也想尝试用第 3 种方案来打造自己的知识管理系统,大可以参考这个办法,用自己熟悉的技术栈来做。

    代码: https://github.com/ahui2016/bijibiji-project (水平有限,请多包涵)

    10 条回复    2018-08-09 18:03:44 +08:00
    aoaoho
        1
    aoaoho  
       2018-08-09 14:20:00 +08:00
    开放式(非私有格式&工具)的文件管理方式也是我特别看重的,我尝试过一些方案,都没有达到预期,包括现在在用 DEVONthink。

    楼主有没有用过 DEVONthink (主界面见图 1 )?说几点供你参考:
    1. 它支持多库,每个库其实就是一个文件夹,在软件内创建的文件会按照扩展名(先不评价这种方式)放在文件系统内(见图 2 );
    1. 文件在软件内也有选项供使用外部应用打开;
    1. 它其中一个功能是,可以把操作系统的文件夹「挂载」到软件内(见图 1,中栏,蓝色的 Blog 文件夹),但索引数据是存在当前所在库的索引文件内。当挂载的文件夹 /文件被外部应用增删改后,它实时监测,并及时更新索引数据;
    1. 它支持很多种类型的文件预览和处理,同时在标签、标注、搜索方面都不错。



    imn1
        2
    imn1  
       2018-08-09 14:28:22 +08:00
    我用方案 3 自写脚本,不过仅自用
    这个方案对媒体文件管理更有用
    SuperMild
        3
    SuperMild  
    OP
       2018-08-09 15:05:20 +08:00
    @aoaoho 感谢提供参考。

    文件管理、知识管理真可谓众口难调,要达到真正好用,需要做非常多、而且非常考虑细节的功能才行。DEVONthink 已经做得很不错,对于如何把操作系统里原有的文件整合进来,也有不错的解决办法。

    比如监控文件变动,自动更新索引,这个功能很不错,也符合很多用户的需求。但是,对于我自己来说,我希望减少自动、减少智能,尽量把更多技术细节呈现给用户,让用户知道发生了什么。所以现在我的解决办法是做一个扫描器,让用户手动扫,如果有文件被移动过,就通过两个列表来反映这个事实:1.在旧的位置文件不见了 2.在新的位置出现了新的文件。

    DEVONthink 属于我说的第 2 种方案,它对于小仓库移到大仓库、不同用户不同电脑之间的分享、局部上传到网盘等等,都有着天然的难点需要攻克。

    而且,DEVONthink 也属于 “掌控力很强的老管家”,很多事情它都可以帮忙安排得很好,但是总觉得它站在我和数据之间、站在我和我的文件之间,让我离我的数据很远,一旦全面拜托它来管理文件,我的迁移成本就会很高。

    而第 3 种方案,每一个文件都是独立的,每一个文件都是自由的,没有老管家掌控一切,而是有很多个谦卑的小仆人(一堆零散的脚本程序),这些程序每个都很小,源代码是容易理解和掌控的,所实现的功能也很有限。

    用着这些简陋的东西,反而让我内心特别安稳。
    SuperMild
        4
    SuperMild  
    OP
       2018-08-09 15:09:13 +08:00
    @imn1 能不能分享一下?我觉得方案 3 的生命力在于,如果有人也用这种方案,那就可以迅速参考借鉴。而且可以针对不同种类的文件来定制特殊功能。
    imn1
        5
    imn1  
       2018-08-09 16:26:15 +08:00
    @SuperMild
    分享就算了,不是什么好东西,当初写的时候就是想到什么就加什么,很多路径都直接写到代码里面,现在都懒得改了

    媒体文件都在 win 下面,所以用 powershell 写的,而且 powershell 写 GUI 比较方便
    GUI 主要是为了拖放,处理多个文件,尤其路径不同、或者文件名有日韩字符时,拖放还是方便些

    可以说一下大致思路:
    1.把真实文件扔到带编号 id 的文件夹,或者文件名本身带 id
    我自己准备了一堆正则模板,方便编号和改名,把流水 id 加上去
    2.我习惯用 csv,json 不太熟,而且文本编辑器(如 emeditor)打开 csv 很直观,有时一些微改动不需要还上脚本改
    3.增删改查都是小事,也不用说了
    4.做这个最主要是两个
    一个是入库(csv)的工作,利用文件名以及一些预设正则方案,把必要可知信息写入 csv,当然不全,需要后期对字段编辑,但基本上给了 id 后,真实文件就不怎么需要动了,方便固定路径
    二是出库,既然入库就已经固定路径,读取自然也不应随意变更,所以我全部采用虚拟路径,主要是用不同的 tag 写 junction 或者 symlink,前者有个好处是无需 admin 权限,后者需要提权才能生成,虚拟路径自己怎么命名都没所谓,完全不影响实体文件,还可以多对一,同一个 id 在不同分类的虚拟路径都有软链
    有些媒体文件我会搜索 tag 后,生成 playlist 让播放器直接打开

    以前试用过 tagspace,不过免费版还是比较弱
    而且这些工具对我有一点是无法用下去的:图片管理,我的图片千万级,这些工具全部默认是文件管理,而我对图片管理只需要目录管理就够了,采用文件级 tag 的我用过 N 个的全部崩溃

    知识管理我觉得也是目录 /文件夹管理比较好
    目前没找到一个可以左边树目录,右边打开预览或浏览的工具,例如 mhtml,还是要在 chrome 打开
    不过相信一个工具要支持这么多格式还是比较难
    my101du
        6
    my101du  
       2018-08-09 16:33:29 +08:00
    Eagle 应该就是这么做的。添加一个库后,会把图片全部存到这个库里,每个图片一个描述文件,打开看就是 json,描述了它的一些 meta 信息.(色调,tag,宽度什么的)

    对它的索引感到好奇,毕竟这些描述文件分散在多个目录里,搜索的时候怎么跨这么多目录来高效检索数据呢?
    loveour
        7
    loveour  
       2018-08-09 17:35:26 +08:00
    我最近也在考虑写一个文件管理软件,不过我是为了超过 100TB 的媒体文件,自从 4K 开始普及硬盘空间明显吃紧。第三个方案优点很多,但是描述文件如果和媒体文件放在一起,会不会显得太杂乱?就像来以前的 SVN,会在每个目录下面生成一个.svn 的文件夹,还是说我的理解有误?而且,我要管理的还有照片库,文件量会很大。所以我大概会采用第二个方案,用数据库存储描述,做一些方便迁移的设置比如导入导出到 csv 或者 json 的 txt,以及监控文件夹变动。主要还是我的需求不一样,我没有频繁移动文件的需求,因为我的仓库目录是相对固定的,移动会很少,要发生也会是批量的。想了想,与其说我想写的是文件管理软件,不如说是媒体管理软件吧。用过几个,总觉得不是特别合自己的意。
    SuperMild
        8
    SuperMild  
    OP
       2018-08-09 17:39:13 +08:00
    @imn1 学习了!虚拟路径多对一这招很有启发,生成 playlist 很实用,难怪你专门用来管理多媒体文件。

    如果你的图片管理只需要目录级,也许可以考虑对每个目录配一个描述文件,然后每个目录随机抽取十几或几十张图缩小合并,形成一张比较直观的印象图。


    @my101du 竟然真有软件敢这么简单粗暴用一堆 json 啊……那个,扫描一次 json 文件其实也不慢,我的做法是扫了之后写入 sqlite, 需要检索的时候实际上是借助 sqlite 的,我猜 Eagle 也可能是这样。
    SuperMild
        9
    SuperMild  
    OP
       2018-08-09 17:47:26 +08:00
    @loveour 显得杂乱是个大缺点,但是我移动的需求比较大,只能忍受这个,一般的话第 2 种方案就很好。

    你的文件虽然体积大,但个数其实不多,这种情况下用第 3 种方案效率也很高,第 3 种方案只怕数量多,不怕体积大。就是一堆描述文件会很乱是真的,我感觉一般人都忍受不了这个缺点。折中一下改成 .svn 或 .git 那种形式也可以考虑。
    tinywhale
        10
    tinywhale  
       2018-08-09 18:03:44 +08:00
    描述文件.... 其实操作系统早就有了 Thumbs.db .DS_Store,可以在它的基础上加内容
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     1446 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 27ms UTC 16:43 PVG 00:43 LAX 08:43 JFK 11:43
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86