Классификация данных сама по себе интересная тема для исследований. Я люблю коллекционировать информацию, кажущуюся нужной, и всегда пытался делать логичные иерархии директорий для своих файлов, и однажды во сне я увидел красивую и удобную программу для назначения тэгов файлам, и решил что дальше так жить нельзя.
Проблема иерархических файловых систем
Пользователи часто сталкиваются с проблемой всего выбора места сохранения очередного нового файла и проблемой поиска собственных файлов (иногда имена файлов и вовсе не предназначены для запоминанияс человеком).
Выходом из ситуации могут быть семантические файловые системы, которые обычно являются надстройкой над традиционной файловой системой. Директории в них заменяются семантическими атрибутами, также называемыми тэгами, категориями, метаданными. Я буду использовать чаще термин "категория", т.к. в контексте файловых систем слово "тэг" иногда странновато, особенно когда появляются "подтэги" и "псевдонимы тэгов".
Назначение файлам категорий во многом избавляет от проблем места хранения и поиска файла: если помнишь (или догадываешься) хотя бы об одной из назначенных файлу категорий, то файл уже никогда не пропадёт из виду.
Ранее на Хабре не раз поднималась данная тема (раз, два, три, четыре и др.), здесь я описываю своё решение.
Путь к реализации
Сразу после упомянутого сна я описал в тетради командный интерфейс, обеспечивающий необходимую работу с категориями. Тогда я решил, что за неделю-две можно написать прототип, используя Python или Bash, а потом надо будет провести работу над созданием графической оболочки на Qt или GTK. Реальность, как всегда, оказалась намного суровее, и разработка затянулась.
Изначальная задумка состояла в том, чтобы прежде всего сделать программу с удобным и лаконичным интерфейсом командной строки, которая будет создавать, удалять категории, назначать категории файлам и удалять категории из файлов. Программу я назвал vitis.
Первая попытка создать vitis закончилась ничем, поскольку много времени стало уходить на работу и институт. Вторая попытка была уже чем-то: к магистерской диссертации удалось закончить задуманный проект и даже сделать прототип GTK-оболочки. Но та версия оказалась настолько ненадёжной и неудобной, что пришлось многое переосмысливать.
Третьей версией я уже реально пользовался сам очень долгое время, переведя на категории несколько тысяч своих файлов. Этому в том числе сильно способствовало реализованное автодополнение 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
Посоздаём ещё категорий и подабавляем файлов при помощи "assign". Если файлы присваиваются ещё не существующим категориям, выдаётся запрос на их создание. Лишнего запроса можно избежать, если использовать флаг --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 Статистика
Не только обычные файлы
Интернет-ссылки
Для унификации хранения любой информации было бы полезно, как минимум, категоризировать ссылки на Интернет-ресурсы. И это возможно:
vitis assign Хабр Цветоаномалия -i https://habr.com/ru/company/sfe_ru/blog/437304/ --yes
В специальном месте будет создан файл с заголовком HTML-страницы и с расширением .desktop. Это традиционый формат ярлыка в GNU/Linux. Такие ярлыки получают автоматическую категорию 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, так что он тоже должен быть в системе. Сначала хотел сделать это на основе 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 в домашней директории пользователя создаётся директория "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 и файловые пространства теоретически иногда могут переезжать с места на место. Для приведения к работоспособности я создал отдельную утилиту link-editor, которая может массово редактировать ссылки, заменяя части пути на другие:
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 и 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, он уже непригоден к использованию.)
Заключение
Vitis — не первая попытка радикально изменить стиль работы со данными, но я посчитал важным реализовать свои идеи и выложить реализацию в открытый доступ под лицензией GNU GPL. Для удобства сделан deb-пакет для x86-64, он должен работать на всех современных Debian-дистрибутивах. На ARM оказались небольшие сложности (при этом все остальные программы, связанные с vitis работают нормально), но в дальнейшем и под эту платформу (armhf) будет собран работающий пакет. Созданием RPM-пакетов пока перестал заниматься в связи с проблемами на Fedora 30 и проблематичностью распыляться на множество RPM-дистрибутивов, но позже всё равно хоть для пару из них будут делаться пакеты. А пока можно пользоваться make && make install
или checkinstall
.
Всем спасибо за внимание! Надеюсь, данная статья и данный проект смогут кому-нибудь оказаться полезными.
Ссылка на репозиторий проекта