Вдохновившись статьей
"Категории вместо директорий, или Семантическая файловая система для 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"
>> }
Тем, кто не понял, что я сделал:
- Получил список файлов в папке
Pink Floyd - The Wall
- Каждый файл преобразовал в полный путь к ним
- Добавил каждый файл в категорию
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.
Как это сделать:
- Установить пакет Microsoft.PowerShell.SDK
- Использовать класс PowerShell и вызывать Graphile.
Если вам понравился проект, делайте коммиты, merge request
'ы и создавайте обсуждения.
Спасибо, за прочтение! Пользуйтесь и наслаждайтесь!
Комментарии (24)
lair
17.09.2019 12:23+1Но такая файловая система ни в коем случае не подходит для хранения кода, исходников и т. д. Она предназначена для хранения, например, семейных фото, музыки, документов.
Семейные фото и музыку я давно в файловой системе не храню. Ну то есть как, где-то там внизу, наверное, файловая система есть, но я ей не пользуюсь, потому что зачем?
Остаются документы, которых в моей жизни настолько немного и редко, что их все равно проще найти полнотекстовым поиском, чем вспоминать, какую категорию я им присвоил год назад.
freakru
17.09.2019 14:21Graphile не слишком удачное название, если гуглить то находятся тулзы для GraphQL www.graphile.org
ivanych
17.09.2019 22:42Задал вопрос вопрос автору вдохновившей вас статьи, задам и вам:
Допустим, у нас 1000 файлов в подкатегории X/Y. Как переместить подкатегорию X/Y в категорию Z, чтобы файлы теперь оказались в подкатегории Z/Y? Придется для каждого из 1000 файлов выполнить присвоение подкатегории? Т.е. будет 1000 операций записи?
chelsea2
18.09.2019 12:17-1Есть такие утилиты как grep, find, sed уже 10 лет пользуюсь им для поиска нужных файлов по тегам написаным в имени файла/метаданных файлов, ключевых словах в самом файле и т.д… Зачем хранить метаинформацию о файле в какой-то левой ФС, если эту информацию можно хранить в самом файле.
В windows есть WSL, а так же cygwin, mingw, пользоваться PowerShell-oм в 2019 году, эм даже писать не буду, это как минимум странно. Да даже лучше на C# писать скрипты и компилировать, чем на PS.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.
chelsea2
18.09.2019 13:37-2Где ты ведел в моем сообщении хоть одно слово `bash`. Или что-то придумал, что-то ответил?
Дальше.
>> То есть PowerShell очень легко с C# интегрировать
Но зачем??? В C# нет каких-то возможностей которые предоставляет PS?
>>Не нужно парсить текст, все программе подается на блюдечке.
С таким успехом можно взять обычную sqlite с тремя несчасными таблицами many-to-many и набивать вручную тегами и ссылками на файлы. Кроссплатфоменность, интеграция с кучей ЯП, есть готовая IDE что бы вбивать туда данные руками даже без ложки и вилки.
Дальше.
Теги — это малая частичка информации по которым обычно ищут файлы. А файлы ищут по метатегам: размер картинки, длина трека, исполнитель, когда создан файл, какой тип файла.
Предлагается пользователю вручную конвертировать эти данные в теги?
А как быть с содержимым? предлагается пользователю каждое слово, предложение и отдельно взятый байт записать как тег по котором он сможет потом найти свой «пароль для мыла xxx@email.com от алиехпресс»?
GBK Автор
18.09.2019 13:48В C# нет каких-то возможностей которые предоставляет PS?
Да. Это вводишь pwsh, и быстренько пишешь. Все командлеты уже готовы.
Все таки не просто так у вас карма -20...
lair
18.09.2019 12:36+1Зачем хранить метаинформацию о файле в какой-то левой ФС, если эту информацию можно хранить в самом файле.
… сказал человек, который только что написал "поиска нужных файлов по тегам написаным в имени файла/метаданных файлов". А имена и метаданные файлов разве не в ФС хранятся?
chelsea2
18.09.2019 14:41-2А где по твоему хранятся метаданные? Попроси в конце-концов своего учителя информатики помочь тебе открыть заставку своего рабочего стола с котиками(картинка.jpg) в хекс редакторе и внезапно, своими глазами, увидишь секретную информацию спрятанную в файле.
lair
18.09.2019 14:46Метаданные хранятся, сюрприз, в хранилище метаданных. Им может быть файловая система, может быть внешняя БД — много что может быть. То, что хранится в файле, с точки зрения файла — данные (при этом файл сам может быть сложным хранилищем, которое содержит данные и метаданные, но это уже другой уровень абстракции).
Простой пример: вот у меня есть файл kotiki.cs, у которого есть метаданные вида "дата создания". Покажите мне, где эта дата создания хранится в файле. Да ладно, фиг с ней, с датой, покажите мне, где в этом файле хранится его имя.
PS Про учителя информатики было бы смешно, если бы я сам ее не преподавал несколько лет.
chelsea2
18.09.2019 15:41-2>> То, что хранится в файле, с точки зрения файла — данные
Занимательно читать как человек размышляет о чем думают файлы.
Еще раз отвечу на вопрос
>> А имена и метаданные файлов разве не в ФС хранятся?
и другой текст написанный выше:
Вот здесь по ссылочке уже написанно, что такое метаданные и где они хранятся https://ru.wikipedia.org/wiki/Метаданные
lair
18.09.2019 16:00+1(занимательно читать, как человек не понимает простейшей метонимии)
Ненене, давайте на примерах. Имя файла является его метаданными? А дата его создания?
Alex_ME
18.09.2019 17:58+1Категории — это хорошо. Я тоже неудовлетворен обычной древовидной ФС, но пока ничего для себя не решил.
Но вот это мне не нравится
Файлы хранятся не в иерархии папок, а в "куче"
…
Но такая файловая система ни в коем случае не подходит для хранения кода, исходников и т. д.
Она предназначена для хранения, например, семейных фото, музыки, документов.ИМХО, но я люблю имеет контроль над внутренним представлением, если эти возможно. К тому же, для многих задач обычной древовидной иерархии хватает. Поэтому (опять-таки ИМХО) стоит сохранять привычную файловую структуру и дополнить ее категориями. Также директории тоже могут иметь категории (например, есть директория проекта с кучей файла внутри: исходники, система контроля версий, билд, но для системы категорий это одна сущность).
Преимущества:
- сохранение привычной структуры как некого fallback
- возможность хранить код или ещё что-то со внутренней структурой
- дружелюбнее к облакам (возможность поделиться ссылкой на ту или иную директорию, если вы синхронизуете ваши файлы с облаком)
- данные не превращаются совсем уж в кашу в случае разрушения структуры категорий (по той или иной причине. Как у вас это все хранится?).
Am0ralist
18.09.2019 18:14А главная проблема, что винда не любит папки с тысячами фалов.
Видимо, у автора нет такого количества данных, которые нужно систематизировать.
Vindex
18.09.2019 23:02Мне, конечно, приятно, что мой проект может вдохновлять, но использовать существенный фрагмент названия чьей-либо статьи, как минимум, не очень красиво и может ввести в заблуждение.
dipsy
Категория может быть в виде обычной папки, куда можно складывать симлинки на файлы, относящиеся к этой категории.
Проблема в том, что это тоже ручная разметка по категориям, т.е. для особого типа людей, которые реально будут этим заниматься.
Для музыки и фото уже есть попытки автоматической категоризации, типа группировки фото по распознанным лицам, наверное за этим будущее для реальных применений.
GBK Автор
В будущей версии, категории будут представляться в виде графа. Кстати поэтому я назвал Graphile.
Согласен.