Вдохновившись статьей


"Категории вместо директорий, или Семантическая файловая система для Linux Vitis",

я решил сделать свой аналог утилиты vitis для PowerShell Core.


Зачем я начал это делать


Во первых, vitis только для Linux.
Во вторых, хочется пользоваться "трубами" в PowerShell.


Так как я захотел сделать кроссплатформенную утилиту, я выбрал .Net Core.


Предыстория


Сначала был хаос. Потом на диске появились папки.
Но хаос все еще царил. И появились теги, а также подтеги и синонимы тегов. Но хаос захватил и их. И были придуманы категории.


Концепция


Файлы хранятся не в иерархии папок, а в "куче", с определенными категориями. Один файл может пренадлежать нескольким категориям.


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


Но такая файловая система ни в коем случае не подходит для хранения кода, исходников и т. д.
Она предназначена для хранения, например, семейных фото, музыки, документов.


Использование


Ну что же, приступим к демонстрации.


Установим Graphile:


# install.ps1 находится в корневой папке с кодом
PS D:\Source\repos\Graphile> .\install.ps1

Сначала инициализируем Graphile в папке:


# Импортируем установленный модуль
PS C:\Users\Dell\GraphileTest> Import-Module GraphilePowerShell
# Инициализируем Graphile в папке
PS C:\Users\Dell\GraphileTest> Init-Graphile
C:\Users\Dell\GraphileTest\graphile.db

Итак, мы все настроили. Теперь можно создать новую категорию:


PS C:\Users\Dell\GraphileTest> New-Category -Name "music"
music

Добавим файлы:


PS C:\Users\Dell\GraphileTest> Get-ChildItem "D:\Music\Pink Floyd - The Wall" -Recurse -Filter "*.mp3" | foreach { $_.FullName } | foreach {
>> Add-FileToCategory -File $_ -Categories "music"
>> }

Тем, кто не понял, что я сделал:


  1. Получил список файлов в папке Pink Floyd - The Wall
  2. Каждый файл преобразовал в полный путь к ним
  3. Добавил каждый файл в категорию music

Теперь проверим, действительно ли мы добавили файлы в категорию:


PS C:\Users\Dell\GraphileTest> List-Graphiles | Format-Table

Будет выведен список в формате:


CategoriesNames Id Categories Name Extension

Добавим еще категорий и файлов:


New-Category -Name "the-wall"
New-Category -Name "alan-parsons"

List-Graphiles -Categories "music" | foreach { Add-GraphileToCategory -Categories "the-wall" -Files $_.Name }

Get-ChildItem "D:\Music\The Alan Parsons Project - Turn of a Friendly Card" -File -Recurse | foreach { $_.FullName } | foreach { Add-FileToCategory -File $_ -Categories "music", "alan-parsons" }

Проверим файлы:


List-Graphiles -Categories "alan-parsons" | Format-Table

Команда выведет все файлы, которые пренадлежат категории alan-parsons.


Больше файлов богу файловых систем!


New-Category -Name "images"
Get-ChildItem "D:\Изображения" -File -Recurse | foreach { $.FullName } | foreach {
    Add-FileToCategory -File $_ -Categories "images"
}

Проверяем:


List-Graphiles -Categories "images" | Format-Table

Все работает!


Но это только начало. Экспортируйте свою обычную файловую систему в Graphile и получите отличную организацию файлов.


Откуда скачать Graphile


Вот ссылка на GitLab Graphile'а.


Лицензия MIT, так что можете использовать даже в коммерческих целях.


Будущее проекта


Так как это PowerShell, а не хухры-мухры, можно сделать графическую оболочку под .NET Core.


Как это сделать:


  1. Установить пакет Microsoft.PowerShell.SDK
  2. Использовать класс PowerShell и вызывать Graphile.

Если вам понравился проект, делайте коммиты, merge request'ы и создавайте обсуждения.


Спасибо, за прочтение! Пользуйтесь и наслаждайтесь!

Комментарии (24)


  1. dipsy
    17.09.2019 10:54
    +1

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


    1. GBK Автор
      17.09.2019 11:00

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

      В будущей версии, категории будут представляться в виде графа. Кстати поэтому я назвал Graphile.


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

      Согласен.


  1. lair
    17.09.2019 12:23
    +1

    Но такая файловая система ни в коем случае не подходит для хранения кода, исходников и т. д. Она предназначена для хранения, например, семейных фото, музыки, документов.

    Семейные фото и музыку я давно в файловой системе не храню. Ну то есть как, где-то там внизу, наверное, файловая система есть, но я ей не пользуюсь, потому что зачем?


    Остаются документы, которых в моей жизни настолько немного и редко, что их все равно проще найти полнотекстовым поиском, чем вспоминать, какую категорию я им присвоил год назад.


    1. zacat
      17.09.2019 13:58

      Что используете для фото?


      1. lair
        17.09.2019 14:01

        Lightroom для работы, Google Photos для поездок.


  1. freakru
    17.09.2019 14:21

    Graphile не слишком удачное название, если гуглить то находятся тулзы для GraphQL www.graphile.org


    1. GBK Автор
      18.09.2019 12:26

      Эх… С названием поторопился.


  1. ovsale
    17.09.2019 16:20

    вы предлагаете организовывать фотографии без GUI? или я что то не понял?


  1. ivanych
    17.09.2019 22:42

    Задал вопрос вопрос автору вдохновившей вас статьи, задам и вам:


    Допустим, у нас 1000 файлов в подкатегории X/Y. Как переместить подкатегорию X/Y в категорию Z, чтобы файлы теперь оказались в подкатегории Z/Y? Придется для каждого из 1000 файлов выполнить присвоение подкатегории? Т.е. будет 1000 операций записи?


    1. GBK Автор
      18.09.2019 14:34

      К сожалению(


    1. ovsale
      18.09.2019 19:46

      обратите внимание на tags4.info там есть это и много всего еще


  1. chelsea2
    18.09.2019 12:17
    -1

    Есть такие утилиты как grep, find, sed уже 10 лет пользуюсь им для поиска нужных файлов по тегам написаным в имени файла/метаданных файлов, ключевых словах в самом файле и т.д… Зачем хранить метаинформацию о файле в какой-то левой ФС, если эту информацию можно хранить в самом файле.
    В windows есть WSL, а так же cygwin, mingw, пользоваться PowerShell-oм в 2019 году, эм даже писать не буду, это как минимум странно. Да даже лучше на C# писать скрипты и компилировать, чем на PS.


    1. GBK Автор
      18.09.2019 12:20

      Пользоваться PowerShell-oм в 2019 году, эм даже писать не буду, это как минимум странно.

      Пользоваться bash'ем в 2019 году, эм даже писать не буду, это как минимум странно.


      Преймущейство Graphile в том, что он не текст возвращает, как grep, find, sed, а объекты PSObject. То есть PowerShell очень легко с C# интегрировать. Можно даже без труда графическую оболочку запилить.


      Не нужно парсить текст, все программе подается на блюдечке.


      Пользоваться PowerShell в 2019 году не странно. PowerShell в некоторых моментах даже лучше чем bash. Тем более появился PowerShell Core, который работает и на Linux, и на OS X и на Windows.


      1. chelsea2
        18.09.2019 13:37
        -2

        Где ты ведел в моем сообщении хоть одно слово `bash`. Или что-то придумал, что-то ответил?

        Дальше.

        >> То есть PowerShell очень легко с C# интегрировать

        Но зачем??? В C# нет каких-то возможностей которые предоставляет PS?

        >>Не нужно парсить текст, все программе подается на блюдечке.

        С таким успехом можно взять обычную sqlite с тремя несчасными таблицами many-to-many и набивать вручную тегами и ссылками на файлы. Кроссплатфоменность, интеграция с кучей ЯП, есть готовая IDE что бы вбивать туда данные руками даже без ложки и вилки.

        Дальше.
        Теги — это малая частичка информации по которым обычно ищут файлы. А файлы ищут по метатегам: размер картинки, длина трека, исполнитель, когда создан файл, какой тип файла.

        Предлагается пользователю вручную конвертировать эти данные в теги?

        А как быть с содержимым? предлагается пользователю каждое слово, предложение и отдельно взятый байт записать как тег по котором он сможет потом найти свой «пароль для мыла xxx@email.com от алиехпресс»?


        1. GBK Автор
          18.09.2019 13:48

          В C# нет каких-то возможностей которые предоставляет PS?

          Да. Это вводишь pwsh, и быстренько пишешь. Все командлеты уже готовы.


          Все таки не просто так у вас карма -20...


    1. lair
      18.09.2019 12:36
      +1

      Зачем хранить метаинформацию о файле в какой-то левой ФС, если эту информацию можно хранить в самом файле.

      … сказал человек, который только что написал "поиска нужных файлов по тегам написаным в имени файла/метаданных файлов". А имена и метаданные файлов разве не в ФС хранятся?


      1. chelsea2
        18.09.2019 14:41
        -2

        А где по твоему хранятся метаданные? Попроси в конце-концов своего учителя информатики помочь тебе открыть заставку своего рабочего стола с котиками(картинка.jpg) в хекс редакторе и внезапно, своими глазами, увидишь секретную информацию спрятанную в файле.


        1. lair
          18.09.2019 14:46

          Метаданные хранятся, сюрприз, в хранилище метаданных. Им может быть файловая система, может быть внешняя БД — много что может быть. То, что хранится в файле, с точки зрения файла — данные (при этом файл сам может быть сложным хранилищем, которое содержит данные и метаданные, но это уже другой уровень абстракции).


          Простой пример: вот у меня есть файл kotiki.cs, у которого есть метаданные вида "дата создания". Покажите мне, где эта дата создания хранится в файле. Да ладно, фиг с ней, с датой, покажите мне, где в этом файле хранится его имя.


          PS Про учителя информатики было бы смешно, если бы я сам ее не преподавал несколько лет.


          1. chelsea2
            18.09.2019 15:41
            -2

            >> То, что хранится в файле, с точки зрения файла — данные
            Занимательно читать как человек размышляет о чем думают файлы.

            Еще раз отвечу на вопрос
            >> А имена и метаданные файлов разве не в ФС хранятся?
            и другой текст написанный выше:
            Вот здесь по ссылочке уже написанно, что такое метаданные и где они хранятся https://ru.wikipedia.org/wiki/Метаданные


            1. lair
              18.09.2019 16:00
              +1

              (занимательно читать, как человек не понимает простейшей метонимии)


              Ненене, давайте на примерах. Имя файла является его метаданными? А дата его создания?


  1. Alex_ME
    18.09.2019 17:58
    +1

    Категории — это хорошо. Я тоже неудовлетворен обычной древовидной ФС, но пока ничего для себя не решил.


    Но вот это мне не нравится


    Файлы хранятся не в иерархии папок, а в "куче"

    Но такая файловая система ни в коем случае не подходит для хранения кода, исходников и т. д.
    Она предназначена для хранения, например, семейных фото, музыки, документов.

    ИМХО, но я люблю имеет контроль над внутренним представлением, если эти возможно. К тому же, для многих задач обычной древовидной иерархии хватает. Поэтому (опять-таки ИМХО) стоит сохранять привычную файловую структуру и дополнить ее категориями. Также директории тоже могут иметь категории (например, есть директория проекта с кучей файла внутри: исходники, система контроля версий, билд, но для системы категорий это одна сущность).


    Преимущества:


    • сохранение привычной структуры как некого fallback
    • возможность хранить код или ещё что-то со внутренней структурой
    • дружелюбнее к облакам (возможность поделиться ссылкой на ту или иную директорию, если вы синхронизуете ваши файлы с облаком)
    • данные не превращаются совсем уж в кашу в случае разрушения структуры категорий (по той или иной причине. Как у вас это все хранится?).


    1. Am0ralist
      18.09.2019 18:14

      А главная проблема, что винда не любит папки с тысячами фалов.
      Видимо, у автора нет такого количества данных, которые нужно систематизировать.


    1. GBK Автор
      18.09.2019 18:15

      Хорошая идея!


  1. Vindex
    18.09.2019 23:02

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