数据分类本身就是一个有趣的研究主题。 我喜欢收集似乎必要的信息,并且我一直试图为我的文件建立逻辑的目录层次结构,一次梦到我看到了一个美丽而又方便的程序,为文件分配标签,并决定不可能像这样继续存在。
分层文件系统的问题
用户经常遇到选择下一个新文件保存在何处的问题,以及找到自己的文件的问题(有时文件名根本不打算供人存储)。
解决这种情况的方法可以是语义文件系统,它通常是传统文件系统的附加组件。 其中的目录被语义属性(也称为标签,类别,元数据)替换。 我会更频繁地使用“类别”一词,因为 在文件系统中,“标签”一词有时很奇怪,尤其是当出现“子标签”和“标签别名”时。
为文件分配类别很大程度上消除了文件存储和搜索的问题:如果您记住(或猜测)了至少一个分配给文件的类别,则文件将永远不会消失。
早在哈布雷(Habré)时,曾多次提出该主题( 一 , 二 , 三 , 四等),这里我描述我的决定。
实施路径
在完成上述梦想之后,我立即在笔记本中描述了提供必要的类别工作的命令界面。 然后,我决定在一两周内就可以使用Python或Bash编写原型,然后需要在Qt或GTK上创建图形外壳。 一如既往,现实变得更加严峻,发展被拖延了。
最初的想法是首先使用方便,简洁的命令行界面制作一个程序,该程序可以创建,删除类别,为文件分配类别以及从文件中删除类别。 我称该程序为vitis 。
自从很多时间开始上班和上大学以来,制造葡萄的第一次尝试都以失败告终。 第二次尝试已经是什么了:通过硕士论文,我们设法完成了计划的项目,甚至制作了GTK Shell的原型。 但是事实证明,这个版本太不可靠和不舒服了,我不得不重新考虑一下。
我自己已经很长时间使用第三版了,将我的数千个文件转换为类别。 除其他事项外,已实施的bash完成极大地促进了这一过程。 但是仍然存在一些问题,例如缺少自动类别和存储相同名称的文件的能力,并且该程序已经陷入其自身的复杂性之中。 因此,我需要解决开发复杂软件的问题:编写详细的要求,开发功能测试系统,研究包装说明等。 现在我已经制定了计划,因此可以将这种适度的创建呈现给自由社区。 通过类别概念进行管理这样的特定文件管理可以解决意外的问题,在解决这些问题时, vitis围绕自身又产生了五个项目,其中一些将在本文中提及。 到目前为止, vitis尚未获得图形外壳,但是从命令行使用文件类别的便利性已经为我涵盖了常规图形文件管理器的所有优点。
使用范例
让我们从一个简单的开始-创建一个类别:
vitis create
让我们添加一些组成作为示例:
vitis assign -f "The Ink Spots - I Don't Want To Set The World On Fire.mp3"
您可以通过show命令查看“音乐”类别的内容:
vitis show
您可以使用“ open”子命令播放它
vitis open
因为 我们在“音乐”类别中只有一个文件,那么只有它会启动。 为了使用程序打开文件,默认情况下,我制作了一个单独的实用程序vts-fs-open (由于多种原因,xdg-open或mimeopen之类的标准工具不适合我;但是,如果有的话,您可以在设置中为通用文件打开指定另一个实用程序) 。 该实用程序可以在具有不同工作环境的不同发行版上很好地工作,因此我建议将其与vitis一起安装。
您也可以直接指定用于打开文件的程序:
vitis open --app qmmp

让我们创建更多类别并使用“分配”添加文件。 如果将文件分配给尚不存在的类别,则会发出创建文件的请求。 使用--yes标志可以避免不必要的请求。
vitis assign R -f " R.pdf" " R: .pdf" --yes
现在,我们想将类别“数学”添加到文件“统计包R:概率理论和统计学.pdf”中。 我们知道此文件已经具有类别“ R”,因此我们可以使用来自Vitis系统的分类路径:
vitis assign -v "R/ R: .pdf"
幸运的是,bash自动补全将使此操作变得容易。
使用--categories标志查看发生了什么,以查看每个文件的类别列表:
vitis show R --categories

请注意,还按格式,类型(组合格式)和文件扩展名为文件分配了自动类别。 这些类别可以选择禁用。 以后我一定会对其名称进行本地化。
我们将在“数学”中添加其他内容以进行更改:
vitis assign -f " - 1984.pdf" ___1927.djvu
现在,乐趣开始了。 可以使用联合,交集和减法运算来编写表达式,而不是类别,即对集合使用运算。 例如,“数学”与“ R”的交集将得到一个文件。
vitis show R i:
从“数学”中减去对语言“ R”的引用:
vitis show \\ R # vitis show c: R
我们可以将音乐和R语言无缝结合:
vitis show u: R
-n标志允许您按数字和/或范围从查询结果中“拉出”必要的文件,例如-n 3-7
或更复杂的: -n 1,5,8-10,13
。 open子命令通常很有用,它使您可以从列表中打开所需的文件。

尽管我们不再使用通常的目录层次结构,但嵌套类别通常很有用。 为类别“数学”创建一个子类别“统计”,并将此类别添加到适当的文件中:
vitis create / vitis assign / -v "R/ R.pdf" vitis show --categories

我们可以看到,该文件现在具有“数学/统计”类别,而不是“数学”类别(跟踪了额外的链接)。
访问完整路径可能很不方便,请创建“全局”别名:
vitis assign / -a vitis show

不只是常规文件
互联网链接
为了统一任何信息的存储,至少对归类到Internet资源的链接进行分类将很有用。 并且可能:
vitis assign -i https://habr.com/ru/company/sfe_ru/blog/437304/ --yes
在一个特殊的地方,将创建一个带有HTML页面标题和扩展名.desktop的文件。 这是GNU / Linux中的传统快捷方式格式。 这样的快捷方式将获得自动的NetworkBookmarks类别。
自然,会创建快捷方式来使用它们:
vitis open
执行该命令将导致在浏览器中打开刚刚保存的链接。 Internet资源的分类快捷方式可以代替浏览器书签。
文件碎片
拥有单个文件片段的类别也很有用。 出价不错,是吗? 但是到目前为止,当前的实现仅影响普通的文本文件,音频和视频文件。 假设您需要记录音乐会中的特定片段或电影中的有趣时刻,然后在使用assign时可以使用--fragname,-start,-finish标志。 保存Duck Tales的屏幕保护程序:
vitis assign -c -f Duck_Tales/s01s01.avi --finish 00:00:59 --fragname "Duck Tales intro" vitis open
实际上,不会发生文件剪辑;而是创建一个片段的文件指针,该指针描述了文件类型,文件路径,片段的开头和结尾。 片段的指针的创建和打开被委托给我专门出于这些目的而制作的实用程序-它们是mediafragmenter和fragplayer。 第一个创建,第二个打开。 对于音频和视频录制,使用VLC播放器从某个位置到某个位置启动媒体文件,因此它也必须在系统中。 起初,我想在mplayer的基础上执行此操作,但是由于某种原因,它在正确的时间定位时非常歪斜。
在我们的示例中,创建了文件“ Duck Tales intro.fragpointer”(放置在特殊位置),然后在59秒内播放了从文件开头(因为未在创建时指定--start)到该标记的片段。关闭。
再举一个例子-我们决定在一些著名艺术家的音乐会上对另一场表演进行分类:
vitis assign " " -f \ c\ -\ \ \ -\ \ \ .mp4 --fragname " " --start 00:32:18 --finish 00:36:51 vitis open " "
当您打开文件时,文件将包含在所需位置,并且在四分半钟后它将关闭。
运作方式及其他功能
分类存储
在开始思考语义文件系统的组织时,我想出了三种方法:通过存储符号链接,通过数据库,通过XML描述。 第一种方法获胜是因为 一方面,它很容易实现,另一方面,用户有机会直接从文件系统中查看类别(这既方便又重要)。 在开始使用vitis时 ,将在用户的主目录中创建目录“ Vitis”和配置文件“ .config / vitis / vitis.conf”。 〜/ Vitis创建与类别相对应的目录,并在这些类别目录中创建指向原始文件的符号链接。 类别别名也只是指向它们的链接。 当然,主目录中“ Vitis”目录的存在可能不适合某人。 我们可以切换到其他任何地方:
vitis service set path /mnt/MyFavoriteDisk/Vitis/
在某一时刻,很明显,分散在不同位置的文件没有意义,因为它们的位置可能会发生变化。 因此,对于初学者来说,我为自己创建了一个目录,在那里我愚蠢地转储了所有内容并为所有内容提供了类别。 然后,他决定最好在软件级别正式确定这一刻。 因此出现了“文件空间”的概念。 在开始使用vitis时 ,立即设置一个这样的位置(我们需要的所有文件都将存储在此处)并启用自动保存不会有什么坏处:
vitis service add filespace /mnt/MyFavoriteDisk/Filespace/ vitis service set autosave yes
如果没有自动保存,如果要将添加的文件保存到文件空间,则使用“ assign”子命令将需要--save标志。
此外,您可以添加几个文件空间并更改其优先级,当有很多文件并且它们存储在不同的介质上时,这很有用。 在这里,我不会考虑这种可能性,有关详细信息,请参见该程序的帮助。
语义文件系统的迁移
从理论上讲,Vitis目录和文件空间有时可以在一个地方移动。 为了使其工作,我创建了一个单独的链接编辑器实用程序,该实用程序可以批量编辑链接,用其他路径替换路径的一部分:
cp -r /mnt/MyFavoriteDisk/Vitis/ ~/Vitis link-editor -d ~/Vitis/ -f /mnt/MyFavoriteDisk/Vitis/ -r ~/Vitis/ -R cp -r /mnt/MyFavoriteDisk/Filespace/ ~/MyFiles link-editor -d ~/Vitis/ -f /mnt/FlashDrive-256/Filespace/ -r ~/MyFiles -R
在第一种情况下,我们从/ mnt / MyFavoriteDisk / Vitis /移至主目录后,将编辑与别名关联的符号链接。 在第二种情况下,更改文件空间的位置后,Vitis中的所有链接会根据替换部分路径的请求更改为新链接。
汽车类别
如果运行vitis service get autocategorization
,则可以看到自动类别的默认设置是按格式(格式和类型)和文件扩展名(扩展名)。
例如,当您需要在PDF中查找内容或查看从MOBI和FB2存储的内容时,此功能非常有用,您只需执行请求即可
vitis show Format/MOBI u: Format/FB2
碰巧的是,标准的GNU / Linux工具(例如文件或mimetype)并不完全适合我,因为它们并不总是正确地确定格式; 通常,确定文件格式的主题是一个有趣的研究主题,应单独撰写。 就目前而言,我可以说,也许并非为世界上所有格式提供了真正的认可,但总的来说,它现在运行良好。 的确,现在将EPUB格式定义为ZIP(通常是合理的,但实际上不应将其视为正常行为)。 到目前为止,请将此功能视为实验性的,报告错误。 在奇怪的情况下,您始终可以按文件扩展名使用类别,例如Extension / epub。
如果包括按格式自动分类,则还包括按类别组合一些格式的自动分类:“档案”,“图片”,“视频”,“音频”和“文档”。 这些子类别也将使用本地化名称。
没有说什么
事实证明, 葡萄是一个非常多面的工具,很难一次覆盖所有内容。 简要提及您还可以做些什么:
- 类别可以删除,也可以从文件中删除;
- 表达式的查询结果可以复制到指定目录;
- 文件可以作为程序运行;
- show命令具有许多选项,例如,按名称/更改日期或访问权限/大小/扩展名排序,显示文件属性和原始路径,打开隐藏文件的显示等。
- 保存到Internet来源的链接时,还可以保存HTML页面的本地副本。
所有详细信息都可以在用户帮助中找到。
前景展望
持怀疑态度的人常常说:“没人会亲自贴上这些标签。” 使用我的示例,我可以证明相反的情况:我已经对六千多个文件进行了分类,创建了一千多个类别和别名,这是值得的。 当您与一个vitis open
团队一起vitis open
事务列表时,或者当您与一个vitis open LaTeX
团队一起vitis open LaTeX
Stolyarov的书有关LaTeX布局系统的书时,在道德上很难使用“老式”文件系统。
在此基础上,产生了许多想法。 例如,您可以根据当前天气,假日,星期几,一天中的时间或年份制作包含主题音乐的自动收音机。 仍然接近该主题的是一种音乐播放器,它了解类别,并且可以通过对类别(如在集合上)的操作进行表达来播放音乐。 制作一个守护程序来跟踪Downloads目录并提供对新文件的分类很有用。 好吧,当然,您应该制作一个普通的图形语义文件管理器。 有一次我甚至为企业提供了用于文件共享的Web服务,但是尽管它达到了很高的性能水平,但它并不是一个优先事项,并且变得无关紧要。 (由于葡萄膜本身发生了巨大变化,因此已经无法使用。)
结论
Vitis并不是彻底改变数据处理方式的第一次尝试,但是我认为实现我的想法并将实现置于GNU GPL许可下的公共领域很重要。 为了方便起见,已经制作了一个用于x86-64的deb软件包,它应该在所有现代Debian发行版中都可以使用。 在ARM上,存在一些小困难(尽管与vitis相关的所有其他程序都可以正常工作),但是将来,还将为此平台(armhf)构建一个工作包。 到目前为止,由于Fedora 30上的问题以及喷涂到许多RPM发行版上的困难,我已经停止创建RPM软件包了,但是无论如何后来至少有两个可以制作软件包。 同时,您可以使用make && make install
或checkinstall
。
谢谢大家的关注! 我希望本文和该项目对您有所帮助。
链接到项目存储库