Linux 的类别而不是目录或语义文件系统

数据分类本身就是一个有趣的研究课题。 我喜欢收集看似必要的信息,并且我一直尝试为我的文件创建逻辑目录层次结构,有一天在梦中我看到一个漂亮且方便的程序,用于为文件分配标签,我决定我不能活了再这样下去。

分层文件系统的问题

用户经常面临选择在哪里保存下一个新文件的问题以及查找自己的文件的问题(有时文件名根本不是为了让人记住)。

摆脱这种情况的一种方法可能是语义文件系统,它通常是传统文件系统的附加组件。 其中的目录被语义属性(也称为标签、类别和元数据)取代。 我会更频繁地使用“类别”这个词,因为…… 在文件系统的上下文中,“标签”这个词有时有点奇怪,特别是当“子标签”和“标签别名”出现时。

为文件分配类别在很大程度上消除了存储和搜索文件的问题:如果您至少记住(或猜测)分配给文件的类别之一,那么该文件永远不会从视图中消失。

此前,这个话题在 Habré 上不止一次被提出(时间, , , 等),在这里我描述我的解决方案。

实现之路

在提到的梦想之后,我立即在笔记本中描述了提供必要的类别工作的命令界面。 然后我决定在一两周内使用 Python 或 Bash 编写一个原型,然后我必须在 Qt 或 GTK 中创建图形 shell。 现实一如既往地残酷得多,开发也被推迟了。

最初的想法是首先制作一个具有方便简洁的命令行界面的程序,用于创建、删除类别、为文件分配类别以及从文件中删除类别。 我调用了该程序 葡萄.

第一次尝试创建 葡萄 结果一无所获,因为大量的时间开始花在工作和大学上。 第二次尝试已经有所收获:为了硕士论文,我成功地完成了计划的项目,甚至制作了 GTK shell 的原型。 但事实证明该版本非常不可靠且不方便,因此必须重新考虑很多事情。

实际上,我自己使用了第三个版本很长一段时间,将数千个文件转移到类别中。 实现的 bash 补全也极大地促进了这一点。 但一些问题仍然存在,例如缺乏自动分类和存储同名文件的能力,并且该程序已经在其自身的复杂性下屈服了。 这就是我为什么需要解决复杂的软件开发问题:编写详细的需求、开发功能测试系统、研究打包说明等等。 我现在已经制定了我的计划,以便将这个不起眼的创作呈现给自由社区。 具体的文件管理,例如通过类别概念进行管理,会引发意想不到的问题和问题,并在解决它们时 葡萄 围绕它本身又催生了五个项目,其中一些将在本文中提到。 到目前为止 葡萄 我还没有购买图形外壳,但从命令行使用文件类别的便利性对我来说已经超过了常规图形文件管理器的任何优势。

使用的例子

让我们从简单的开始 - 创建一个类别:

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-打开 (由于多种原因,像 xdg-open 或 mimeopen 这样的标准工具不适合我;但是,如果有的话,您可以在设置中指定另一个实用程序来打开通用文件)。 该实用程序在具有不同工作环境的不同发行版上运行良好,因此我建议将其与 vitis 一起安装。

也可以直接指定打开文件的程序:

vitis open Музыка --app qmmp

Linux 的类别而不是目录或语义文件系统

让我们创建更多类别并使用“分配”添加文件。 如果将文件分配给尚不存在的类别,系统会提示您创建它们。 使用 -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

Linux 的类别而不是目录或语义文件系统

请注意,文件还已按格式、类型(组合格式)和文件扩展名自动分类。 如果需要,可以禁用这些类别。 稍后我一定会将他们的名字本地化。

让我们在“数学”中添加一些其他内容以增加多样性:

vitis assign Математика -f "Математический анализ - 1984.pdf" Перельман_Занимательная_математика_1927.djvu 

现在事情变得有趣了。 您可以使用并集、交集和减法运算来编写表达式,即使用集合运算来代替类别。 例如,“Math”与“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 子命令一起使用,它允许您从列表中打开所需的文件。

Linux 的类别而不是目录或语义文件系统

虽然我们不再使用传统的目录层次结构,但嵌套类别通常很有用。 让我们在“数学”类别下创建一个子类别“统计”,并将该类别添加到相应的文件中:

vitis create Математика/Статистика

vitis assign Математика/Статистика -v "R/Введение в R.pdf"

vitis show Математика --categories

Linux 的类别而不是目录或语义文件系统

我们可以看到该文件现在的类别是“数学/统计”而不是“数学”(跟踪额外的链接)。

寻址完整路径可能会很不方便,让我们创建一个“全局”别名:

vitis assign Математика/Статистика -a Статистика

vitis show Статистика

Linux 的类别而不是目录或语义文件系统

不仅仅是普通文件

互联网链接

为了统一任何信息的存储,至少对互联网资源的链接进行分类是有用的。 这是可能的:

vitis assign Хабр Цветоаномалия -i https://habr.com/ru/company/sfe_ru/blog/437304/ --yes

将在特殊位置创建一个文件,其中包含 HTML 页面的标题和扩展名 .desktop。 这是 GNU/Linux 中传统的快捷方式格式。 此类快捷方式会自动分类为网络书签。

当然,创建快捷方式是为了使用:

vitis open Цветоаномалия

执行该命令会导致新保存的链接在浏览器中打开。 互联网资源的分类快捷方式可以替代浏览器书签。

文件碎片

对各个文件进行分类也很有用。 不错的要求,嗯? 但目前的实现仅影响纯文本文件、音频和视频文件。 假设您需要标记音乐会的某个部分或电影中的有趣时刻,那么在使用 allocate 时,您可以使用标志 -fragname、-start、-finish。 让我们保存“DuckTales”的屏幕保护程序:

vitis assign 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”(它被放置在一个特殊的位置),然后从文件的开头播放一个片段(因为创建时未指定 –start)直到 59第二个标记,之后 VLC 关闭。

另一个例子是当我们决定对一位著名艺术家在音乐会上的一场表演进行分类时:

vitis assign Лепс "Спасите наши души" -f Григорий Лепc - Концерт Парус - песни Владимира Высоцкого.mp4 --fragname "Спасите наши души" --start 00:32:18 --finish 00:36:51

vitis open "Спасите наши души"

打开后,文件将包含在所需位置,并在四分半钟后关闭。

工作原理 + 附加功能

存储类别

一开始考虑组织语义文件系统时,我想到了三种方法:通过符号链接的存储、通过数据库、通过 XML 描述。 第一种方法获胜,因为... 一方面,它很容易实现,另一方面,用户有机会直接从文件系统查看类别(这很方便也很重要)。 刚开始使用时 葡萄 “Vitis”目录和“.config/vitis/vitis.conf”配置文件在用户的主目录中创建。 在 ~/Vitis 中创建与类别对应的目录,并在这些类别目录中创​​建到原始文件的符号链接。 类别别名也只是它们的链接。 当然,主目录中存在“Vitis”目录可能不适合某些人。 我们可以切换到任何其他位置:

vitis service set path /mnt/MyFavoriteDisk/Vitis/

在某种程度上,很明显,对分散在不同位置的文件进行分类毫无意义,因为它们的位置可能会发生变化。 因此,首先,我为自己创建了一个目录,在那里我愚蠢地转储了所有内容并给了它所有类别。 然后我决定在程序层面正式确定这一时刻会很好。 这就是“文件空间”概念的出现。 刚开始使用时 葡萄 立即设置这样一个位置(我们需要的所有文件都将存储在那里)并启用自动保存不会有什么坏处:

vitis service add filespace /mnt/MyFavoriteDisk/Filespace/

vitis service set autosave yes

如果没有自动保存,当使用“分配”子命令时,如果要将添加的文件保存到文件空间,则需要 --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,可以看到默认情况下,自动分类是按格式(Format and Type)和文件扩展名(Extension)分配的。

例如,当您需要在 PDF 中查找某些内容或查看从 EPUB 和 FB2 存储的内容时,这非常有用,您只需运行该请求即可

vitis show Format/MOBI u: Format/FB2

碰巧的是,标准的 GNU/Linux 工具(例如 file 或 mimetype)并不适合我,因为它们并不总是正确地确定格式;我必须根据文件签名和扩展名来实现自己的实现。 一般来说,定义文件格式的主题是一个有趣的研究主题,值得单独写一篇文章。 现在我可以说,也许我还没有提供对世界上所有格式的真正识别,但总的来说它已经运作良好。 确实,EPUB 现在将格式定义为 ZIP(一般来说,这是合理的,但实际上这不应被视为正常行为)。 目前,将此功能视为实验性的并报告任何错误。 在奇怪的情况下,您始终可以使用文件扩展名类别,例如 Extension/epub。

如果启用按格式自动分类,则还会启用按类型对某些格式进行分组的自动分类:“档案”、“图片”、“视频”、“音频”和“文档”。 这些子类别也将被命名为本地化名称。

什么没有说

葡萄 事实证明,它是一个非常多方面的工具,很难一次性涵盖所有内容。 让我简单提一下您还可以做什么:

  • 可以从文件中删除和删除类别;
  • 可以将表达式查询的结果复制到指定目录;
  • 文件可以作为程序运行;
  • show 命令有很多选项,例如,按名称/修改日期或访问/大小/扩展名排序、显示文件属性和原始文件路径、启用隐藏文件的显示等;
  • 当您保存 Internet 资源的链接时,您还可以保存 HTML 页面的本地副本。

完整的详细信息可以在用户帮助中找到。

前途

怀疑论者经常说“没有人会自己设置这些标签”。 用我自己的例子,我可以证明相反的情况:我已经对六千多个文件进行了分类,创建了一千多个类别和别名,这是值得的。 当一支球队 vitis open План 打开您的待办事项列表或使用一个命令 vitis open LaTeX 当你打开 Stolyarov 关于 LaTeX 布局系统的书时,你会发现“以老式方式”使用文件系统在道德上已经很困难了。

在此基础上,出现了一些想法。 例如,您可以制作一个自动收音机,根据当前天气、假期、星期几、一天中的时间或一年中的时间打开主题音乐。 更接近主题的是音乐播放器,它了解类别,并且可以通过对类别和集合的操作来表达音乐。 创建一个守护程序来监视“下载”目录并提供对新文件进行分类是很有用的。 当然,我们应该制作一个正常的图形语义文件管理器。 曾几何时,我什至为企业创建了一个Web服务,用于文件的集体使用,但这不是优先事项,变得无关紧要,尽管它实现了很高的性能水平。 (由于重大变化 葡萄,它不再可用。)

这是一个小演示

Linux 的类别而不是目录或语义文件系统

结论

葡萄 这并不是第一次尝试从根本上改变数据处理方式,但我认为实现我的想法并在 GNU GPL 许可证下公开实现这一点很重要。 为了方便起见,我们为 x86-64 制作了 deb 软件包;它应该适用于所有现代 Debian 发行版。 ARM 上有一些小困难(而所有其他与 葡萄,工作正常),但将来将为该平台(armhf)编译一个工作包。 由于 Fedora 30 上的问题以及在许多 RPM 发行版上传播的困难,我现在已经停止创建 RPM 包,但以后的包仍然会为至少其中的几个制作。 在此期间您可以使用 make && make install или checkinstall.

感谢大家的关注! 我希望这篇文章和这个项目能够有用。

链接到项目存储库

来源: habr.com

添加评论