СофтХабрахабр

[Из песочницы] Категории вместо директорий, или Семантическая файловая система для Linux

Я люблю коллекционировать информацию, кажущуюся нужной, и всегда пытался делать логичные иерархии директорий для своих файлов, и однажды во сне я увидел красивую и удобную программу для назначения тэгов файлам, и решил что дальше так жить нельзя. Классификация данных сама по себе интересная тема для исследований.

Пользователи часто сталкиваются с проблемой всего выбора места сохранения очередного нового файла и проблемой поиска собственных файлов (иногда имена файлов и вовсе не предназначены для запоминанияс человеком).

Директории в них заменяются семантическими атрибутами, также называемыми тэгами, категориями, метаданными. Выходом из ситуации могут быть семантические файловые системы, которые обычно являются надстройкой над традиционной файловой системой. в контексте файловых систем слово "тэг" иногда странновато, особенно когда появляются "подтэги" и "псевдонимы тэгов". Я буду использовать чаще термин "категория", т.к.

Назначение файлам категорий во многом избавляет от проблем места хранения и поиска файла: если помнишь (или догадываешься) хотя бы об одной из назначенных файлу категорий, то файл уже никогда не пропадёт из виду.

Ранее на Хабре не раз поднималась данная тема (раз, два, три, четыре и др.), здесь я описываю своё решение.

Тогда я решил, что за неделю-две можно написать прототип, используя Python или Bash, а потом надо будет провести работу над созданием графической оболочки на Qt или GTK. Сразу после упомянутого сна я описал в тетради командный интерфейс, обеспечивающий необходимую работу с категориями. Реальность, как всегда, оказалась намного суровее, и разработка затянулась.

Программу я назвал vitis. Изначальная задумка состояла в том, чтобы прежде всего сделать программу с удобным и лаконичным интерфейсом командной строки, которая будет создавать, удалять категории, назначать категории файлам и удалять категории из файлов.

Вторая попытка была уже чем-то: к магистерской диссертации удалось закончить задуманный проект и даже сделать прототип GTK-оболочки. Первая попытка создать vitis закончилась ничем, поскольку много времени стало уходить на работу и институт. Но та версия оказалась настолько ненадёжной и неудобной, что пришлось многое переосмысливать.

Этому в том числе сильно способствовало реализованное автодополнение 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 Музыка

у нас в категории "Музыка" всего один файл, то запустится только он. Т.к. Эта утилита неплохо работает на разных дистрибутивах с разными рабочими средами, поэтому рекомендую вместе с vitis установить и её. Для целей открытия файлов их программами по умолчанию я сделал отдельную утилиту vts-fs-open (стандартные средства типа xdg-open или mimeopen меня по ряду причин не устраивали; но, если что, в настройках вы можете указать другую утилиту для универсального открытия файлов).

Можно и напрямую указать программу для открытия файлов:

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

Если файлы присваиваются ещё не существующим категориям, выдаётся запрос на их создание. Посоздаём ещё категорий и подабавляем файлов при помощи "assign". Лишнего запроса можно избежать, если использовать флаг --yes.

vitis assign Программирование R -f "Введение в R.pdf" "Статистический пакет R: теория вероятностей и матстатистика.pdf" --yes

Мы знаем, что этот файл уже имеет категорию "R" и поэтому можем использовать категорийный путь из Vitis-системы: Теперь мы хотим добавить файлу "Статистический пакет R: теория вероятностей и матстатистика.pdf" категорию "Математика".

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

Часто бывает полезно с подкомандой open, что позволяет открывать нужные файлы из списка. Флаг -n позволяет "выдёргивать" из результата запроса нужные файлы по номерам и/или диапазонам, например, -n 3-7, или что посложнее: -n 1,5,8-10,13.

Создадим подкатегорию "Статистика" у категории "Математика" и добавим эту категорию подходящему файлу: Хоть мы и отходим от использования обычной иерархии директорий, часто бывает полезно иметь вложенные категории.

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

Можем видеть, что этот файл теперь имеет категорию "Математика/Статистика" вместо "Математика" (лишние ссылки отслеживаются).

Обращаться по полному пути может быть неудобно, создадим "глобальный" псевдоним:

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

Не только обычные файлы

Интернет-ссылки

И это возможно: Для унификации хранения любой информации было бы полезно, как минимум, категоризировать ссылки на Интернет-ресурсы.

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

Это традиционый формат ярлыка в GNU/Linux. В специальном месте будет создан файл с заголовком HTML-страницы и с расширением .desktop. Такие ярлыки получают автоматическую категорию NetworkBookmarks.

Естественно, ярлыки создаются чтобы их использовать:

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

Категоризированные ярлыки на Интернет-источники могут служить заменой браузерным закладкам. Исполнение команды приводит к открытию в браузере только что сохранённой ссылки.

Фрагменты файлов

Неплохая заявка, а? Также полезно иметь категории для отдельных фрагментов файлов. Скажем, вам нужно отметить определённый кусок какого-нибудь концерта или смешной момент в фильме, тогда при использовании assign вы можете воспользоваться флагами --fragname, --start, --finish. Но текущая реализация пока затрагивает только обычные текстовые файлы, аудио- и видеофайлы. Сохраним заставку из "Утиных историй":

vitis assign vitis assign -c Заставки -f Duck_Tales/s01s01.avi --finish 00:00:59 --fragname "Duck Tales intro" vitis open Заставки

Создание и открытие указателей на фрагменты делегируется утилитам, специально мною сделанным для этих целей — это mediafragmenter и fragplayer. Реально никакого отсечения файлов не происходит, вместо этого создаётся файл-указатель на фрагмент, в котором описан тип файла, путь к файлу, начало и и конец фрагмента. В случае аудио- и видеозаписей запуск медиафайла с определённой до определённой позиции происходит при помощи проигрывателя VLC, так что он тоже должен быть в системе. Первая создаёт, вторая открывает. --start не был указан при создании) до метки в 59 секунд, после чего VLC закрывается. Сначала хотел сделать это на основе mplayer'а, но там почему-то очень криво было с позиционированием в нужном моменте.
В нашем примере создаётся файл "Duck Tales intro.fragpointer" (он размещается в особом месте), а затем воспроизводится фрагмент от начала файла (т.к.

Другой пример — мы решили категоризировать отдельное выступление на концерте какого-нибудь известного исполнителя:

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, если будет возникать желание сохранить добавляемый файл в файловое пространство.

Здесь я не буду рассматривать эту возможность, подробности можно почитать в справке к программе. Больше того, можно добавить несколько файловых пространств и менять их приориреты, это может быть полезно, когда файлов очень много и они хранятся на разных носителях.

Миграция семантической файловой системы

Для приведения к работоспособности я создал отдельную утилиту link-editor, которая может массово редактировать ссылки, заменяя части пути на другие: Так или иначе, директория 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

Во втором случае после изменения расположения файлового пространства изменяются все ссылки в Vitis на новые сообразно запросу замены части их пути. В первом случае после того, как мы переехали из /mnt/MyFavoriteDisk/Vitis/ в домашнюю директорию, редактируются символические ссылки, связанные с псевдонимами.

Автоматические категории

Если запустить команду vitis service get autocategorization, то можно увидеть, что по умолчанию настроено назначение автоматических категорий по формату (Format и Type) и расширению файлов (Extension).

Это полезно, когда например вам что-то нужно найти среди PDF-ок или глянуть, что у вас хранится из EPUB и FB2, можно просто выполнить запрос

vitis show Format/MOBI u: Format/FB2

Вообще, тема для определения форматов файлов — интересная тема для исследований и заслуживает отдельной статьи. Так уж получилось, что стандартные средства GNU/Linux типа file или mimetype меня не устроили именно по той причине, что они не всегда верно определяют формат, пришлось делать свою реализацию по сигнатурам файлов и расширениям. Правда, у EPUB сейчас определяется формат как ZIP (в общем-то оправданно, но на практике это не стоит считать нормальным поведением). Пока могу сказать, что, возможно, не для всех форматов в мире я предусмотрел правдивое распознавание, но в целом уже сейчас оно работает неплохо. В странных ситуациях всегда можно использовать категории по расширению файлов, например, Extension/epub. До некоторых пор считайте эту возможность экспериментальной, о багах сообщайте.

Для этих подкатегорий тоже будут сделаны локализованные названия. Если включены автокатегории по формату, также включены автокатегории, объединяющие некоторые форматы по типу: "Archives", "Pictures", "Video", "Audio" и "Documents".

Кратко упомяну о том, что ещё можно делать: vitis получился очень многогранным инструментом, и сложно всё охватить сразу.

  • категории можно удалять и убирать их от файлов;
  • результаты запросов по выражениям можно копировать в указанную директорию;
  • файлы можно запускать как программы;
  • у команды show множество опций, например, сортировка по имени/дате изменения или обращения/размеру/расширению, показ свойств файлов и путей к оригиналам, включение отображения скрытых файлов и др.;
  • при сохранении ссылок на Интернет-источники можно также сохранять локальные копии HTML-страниц.

Все подробности можно найти в пользовательской справке.

На своём примере могу доказать обратное: я уже категоризировал более шести тысяч файлов, создал более тысячи категорий и псевдонимов, и это стоило того. Часто скептики говорят о том, что "никто эти тэги сам расставлять не станет". Когда одной командой vitis open План открываешь список своих дел или когда одной командой vitis open LaTeX открываешь книгу Столярова про систему вёрстки LaTeX, то уже морально сложно пользоваться файловой системой "по старинке".

К примеру, можно сделать автоматическое радио, которое включает тематическую музыку сообразно текущей погоде, празднику, дню недели, времени суток или года. На этой почве возникает ряд идей. Полезно сделать демон, который будет следить за каталогом "Загрузки" и будет предлагать категоризировать новые файлы. Ещё близко к теме — музыкальный проигрыватель, который знает про категории и может проигрывать музыку по выражению с операциями над категориями как над множествами. Когда-то я даже делал для предприятия веб-сервис для коллективного использования файлов, но он был не приоритете и стал неактуальным, хотя и достиг высокого уровня работоспобности. Ну и, конечно, следует бы сделать нормальный графический семантический файловый менеджер. (В связи с большими изменениям в самом vitis, он уже непригоден к использованию.)

здесь маленькая демонстрация

Для удобства сделан deb-пакет для x86-64, он должен работать на всех современных Debian-дистрибутивах. Vitis — не первая попытка радикально изменить стиль работы со данными, но я посчитал важным реализовать свои идеи и выложить реализацию в открытый доступ под лицензией GNU GPL. Созданием RPM-пакетов пока перестал заниматься в связи с проблемами на Fedora 30 и проблематичностью распыляться на множество RPM-дистрибутивов, но позже всё равно хоть для пару из них будут делаться пакеты. На ARM оказались небольшие сложности (при этом все остальные программы, связанные с vitis, работают нормально), но в дальнейшем и под эту платформу (armhf) будет собран работающий пакет. А пока можно пользоваться make && make install или checkinstall.

Надеюсь, данная статья и данный проект смогут кому-нибудь оказаться полезными. Всем спасибо за внимание!

Ссылка на репозиторий проекта

Теги
Показать больше

Похожие статьи

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

Кнопка «Наверх»
Закрыть