Катэгорыі замест дырэкторый, або Семантычная файлавая сістэма для Linux

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

Праблема іерархічных файлавых сістэм

Карыстальнікі часта сутыкаюцца з праблемай усяго выбару месца захавання чарговага новага файла і праблемай пошуку ўласных файлаў (часам імёны файлаў і зусім не прызначаны для запамінання з чалавекам).

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

Прызначэнне файлам катэгорый шмат у чым пазбаўляе ад праблем месца захоўвання і пошуку файла: калі памятаеш (ці здагадваешся) хоць бы аб адной з прызначаных файлу катэгорый, то файл ужо ніколі не знікне.

Раней на Хабры не раз паднімалася дадзеная тэма (раз, два, 3, чатыры і інш.), тут я апісваю сваё рашэнне.

Шлях да рэалізацыі

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

Першапачатковая задумка складалася ў тым, каб першым чынам зрабіць праграму са зручным і лаканічным інтэрфейсам каманднага радка, якая будзе ствараць, выдаляць катэгорыі, прызначаць катэгорыі файлам і выдаляць катэгорыі з файлаў. Праграму я назваў вітыт.

Першая спроба стварыць вітыт скончылася нічым, паколькі шмат часу стала сыходзіць на працу і інстытут. Другая спроба была ўжо нечым: да магістарскай дысертацыі ўдалося скончыць задуманы праект і нават зрабіць прататып GTK-абалонкі. Але тая версія аказалася настолькі ненадзейнай і нязручнай, што прыйшлося многае пераасэнсоўваць.

Трэцяй версіяй я ўжо рэальна карыстаўся сам вельмі доўгі час, перавядучы на ​​катэгорыі некалькі тысяч сваіх файлаў. Гэтаму ў тым ліку моцна спрыяла рэалізаванае аўтадапаўненне 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-open (стандартныя сродкі тыпу xdg-open або mimeopen мяне па шэрагу чыннікаў не ўладкоўвалі; але, калі што, у наладах вы можаце паказаць іншую ўтыліту для ўніверсальнага адкрыцця файлаў). Гэтая ўтыліта нядрэнна працуе на розных дыстрыбутывах з рознымі працоўнымі асяроддзямі, таму рэкамендую разам з vitis усталяваць і яе.

Можна і наўпрост пазначыць праграму для адкрыцця файлаў:

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

Катэгорыі замест дырэкторый, або Семантычная файлавая сістэма для Linux

Паспрабуем яшчэ катэгорый і падабаем файлаў пры дапамозе "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

Катэгорыі замест дырэкторый, або Семантычная файлавая сістэма для Linux

Заўважце, што файлам таксама былі прысвоены аўтаматычныя катэгорыі па фармаце, тыпе (аб'ядноўвае фарматы) і пашырэнню файлаў. Гэтыя катэгорыі пры жаданні адключаемыя. Пазней я абавязкова зраблю лакалізацыю іх назоваў.

Дадамо для разнастайнасці ў «Матэматыку» яшчэ што-небудзь:

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, што дазваляе адчыняць патрэбныя файлы са спісу.

Катэгорыі замест дырэкторый, або Семантычная файлавая сістэма для 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. Такія цэтлікі атрымліваюць аўтаматычную катэгорыю 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" і канфігурацыйны файл ".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

Без аўтазахавання пры выкарыстанні падкаманды «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". Для гэтых падкатэгорый таксама будуць зроблены лакалізаваныя назвы.

Пра што не сказана

вітыт атрымаўся вельмі шматграннай прыладай, і складана ўсё ахапіць адразу. Коратка згадаю аб тым, што яшчэ можна рабіць:

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

Усе падрабязнасці можна знайсці ў карыстацкай даведцы.

Перспектывы

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

На гэтай глебе ўзнікае шэраг ідэй. Напрыклад, можна зрабіць аўтаматычнае радыё, якое ўключае тэматычную музыку па бягучым надвор'і, свята, дню тыдня, часу сутак ці года. Яшчэ блізка да тэмы - музычны прайгравальнік, які ведае пра катэгорыі і можа прайграваць музыку па выразе з аперацыямі над катэгорыямі як над мноствамі. Карысна зрабіць дэман, які будзе сачыць за каталогам "Загрузкі" і будзе прапаноўваць катэгарызаваць новыя файлы. Ну і, вядома, варта б зрабіць нармальны графічны семантычны файлавы мэнэджар. Калісьці я нават рабіў для прадпрыемства вэб-сэрвіс для калектыўнага выкарыстання файлаў, але ён быў не прыярытэце і стаў неактуальным, хаця і дасягнуў высокага ўзроўню працаздольнасці. (У сувязі з вялікімі зменам у самім вітыт, ён ужо непрыдатны да выкарыстання.)

тут маленькая дэманстрацыя

Катэгорыі замест дырэкторый, або Семантычная файлавая сістэма для Linux

Заключэнне

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

Усім дзякуй за ўвагу! Спадзяюся, дадзены артыкул і дадзены праект змогуць аказацца карыснымі.

Спасылка на рэпазітар праекта

Крыніца: habr.com

Дадаць каментар