Categorieën in plaats van mappen, of een semantisch bestandssysteem voor Linux

De classificatie van data is op zich een interessant onderwerp voor onderzoek. Ik hou ervan om informatie te verzamelen die nuttig lijkt, en heb altijd geprobeerd logische hiërarchieën van mappen voor mijn bestanden te maken. Op een nacht droomde ik van een prachtig en gebruiksvriendelijk programma om bestanden van tags te voorzien, en ik besloot dat dit niet langer zo kon doorgaan.

Probleem van hiërarchische bestandsystemen

Gebruikers stuiten vaak op het probleem van waar ze hun nieuwe bestand moeten opslaan en het probleem van het vinden van hun eigen bestanden (soms zijn de bestandsnamen helemaal niet gemaakt om door mensen onthouden te worden).

Een oplossing voor deze situatie kan een semantisch bestandsysteem zijn, dat meestal een uitbreiding is op een traditioneel bestandsysteem. Mappen worden vervangen door semantische attributen, die ook wel tags, categorieën of metadata worden genoemd. Ik zal vaker de term 'categorie' gebruiken, omdat het woord 'tag' in de context van bestandsystemen soms vreemd is, vooral wanneer er 'subtags' en 'aliasen' van tags zijn.

Het toewijzen van categorieën aan bestanden vermindert in hoge mate de problemen met opslaan en het vinden van bestanden: als je je (of vermoedt) tenminste één van de toegewezen categorieën van een bestand herinnert, dan zal het bestand nooit uit zicht raken.

Eerder is dit onderwerp meermaals op Habr behandeld (one, two, drie, vier en anderen), hier beschrijf ik mijn oplossing.

De weg naar implementatie

Meteen na de genoemde droom beschreef ik in een notitieboek de commandoregelinterface die de noodzakelijke functies voor het werken met categorieën moest bieden. Toen besloot ik dat ik binnen een week of twee een prototype kon schrijven met Python of Bash, en daarna zou ik moeten werken aan het creëren van een grafische interface met Qt of GTK. De realiteit was, zoals altijd, veel strenger en de ontwikkeling liep uit.

Het oorspronkelijke idee was om vooral een programma te maken met een gebruiksvriendelijke en beknopte commandoregelinterface dat categorieën kan aanmaken, verwijderen, categorieën aan bestanden kan toewijzen en categorieën uit bestanden kan verwijderen. Ik noemde het programma vitis.

De eerste poging om te creëren vitis stond stil, omdat er veel tijd moest worden besteed aan werk en de universiteit. De tweede poging was al iets: ik slaagde erin het geplande project af te ronden voor mijn masterthese en zelfs een prototype van de GTK-interface te maken. Maar die versie bleek zo onbetrouwbaar en onhandig dat ik veel opnieuw moest overdenken.

Met de derde versie gebruikte ik het zelf echt heel lang, waarbij ik enkele duizenden van mijn bestanden in categorieën heb geplaatst. Dit werd onder andere sterk gefaciliteerd door de gerealiseerde autocompletion in bash. Maar sommige problemen, zoals het ontbreken van automatische categorieën en de mogelijkheid om bestanden met dezelfde naam op te slaan, bleven bestaan, terwijl het programma al onder zijn eigen complexiteit bezweek. Zo kwam ik tot de noodzaak om de problemen van de ontwikkeling van complexe software op te lossen: gedetailleerde vereisten op te stellen, een systeem voor functionele tests te ontwikkelen, instructies voor pakketbeheer te bestuderen en nog veel meer. Nu ben ik aangekomen bij het beoogde resultaat, zodat dit bescheiden werk kan worden gepresenteerd aan de vrije gemeenschap. Dit specifieke bestandsbeheer, zoals het beheren via het concept van categorieën, raakt onverwachte kwesties en problemen aan, en in het oplossen daarvan vitis werd er nog eens vijf projecten omheen geboren, waarvan sommige in het artikel zullen worden genoemd. Tot op de dag van vandaag vitis heb ik geen grafische interface aangeschaft, maar het gebruiksgemak van bestandscategorieën vanuit de commandoregel overschaduwt voor mij al de voordelen van een gewone grafische bestandsbeheerder.

Voorbeelden van gebruik

Laten we beginnen met het eenvoudige — een categorie aanmaken:

vitis create Muziek

Laten we er als voorbeeld een compositie aan toevoegen:

vitis assign Muziek -f "The Ink Spots - I Don't Want To Set The World On Fire.mp3"

De inhoud van de categorie 'Muziek' kan worden bekeken met de subopdracht 'show':

vitis show Muziek

Je kunt deze afspelen met de subopdracht 'open'

vitis open Muziek

Aangezien we in de categorie 'Muziek' maar één bestand hebben, zal alleen dat bestand worden afgespeeld. Voor het openen van bestanden met standaardprogramma's heb ik een aparte tool gemaakt vts-fs-open (Standaard tools zoals xdg-open of mimeopen waren om verschillende redenen niet bevredigend voor mij; maar als het nodig is, kun je in de instellingen een andere tool opgeven voor universeel openen van bestanden). Deze tool werkt goed op verschillende distributies met verschillende desktopomgevingen, daarom raad ik aan om deze samen met vitis te installeren.

Je kunt ook rechtstreeks het programma opgeven voor het openen van bestanden:

vitis open Muziek --app qmmp

Categorieën in plaats van mappen, of een semantisch bestandssysteem voor Linux

Laten we nog meer categorieën aanmaken en bestanden toevoegen met behulp van «assign». Als bestanden aan niet-bestaande categorieën worden toegewezen, wordt er een verzoek gedaan om deze aan te maken. Onnodige verzoeken kunnen worden vermeden door de vlag —yes te gebruiken.

vitis assign Programmeren R -f "Inleiding tot R.pdf" "Statistisch pakket R: kansrekening en wiskundige statistiek.pdf" --yes

Nu willen we het bestand «Statistisch pakket R: kansrekening en wiskundige statistiek.pdf» de categorie «Wiskunde» toewijzen. We weten dat dit bestand al de categorie «R» heeft en kunnen daarom het categoriepunt uit het Vitis-systeem gebruiken:

vitis assign Wiskunde -v "R/Statistisch pakket R: kansrekening en wiskundige statistiek.pdf"

Gelukkig maakt de bash-autocompletion dit eenvoudig.

Laten we kijken wat we hebben gekregen, met de vlag —categories om de lijst van categorieën voor elk bestand te zien:

vitis show R --categories

Categorieën in plaats van mappen, of een semantisch bestandssysteem voor Linux

Merk op dat bestanden ook automatische categorieën zijn toegewezen op basis van formaat, type (combineert formaten) en bestandsextensie. Deze categorieën kunnen indien gewenst worden uitgeschakeld. Later zal ik zeker hun namen lokaliseren.

Laten we voor de afwisseling nog iets toevoegen aan «Wiskunde»:

vitis assign Wiskunde -f "Wiskundige analyse - 1984.pdf" Perelman_Leuke_wiskunde_1927.djvu 

En nu begint het interessante deel. In plaats van categorieën kunnen we uitdrukkingen schrijven met union, intersection en subtraction, dat wil zeggen, we kunnen operaties op verzamelingen gebruiken. Bijvoorbeeld, de intersectie van «Wiskunde» met «R» zal resulteren in één bestand.

vitis show R i: Wiskunde

Trek de verwijzingen naar de taal «R» af van «Wiskunde»:

vitis show Wiskunde R  #of vitis show Wiskunde c: R

We kunnen muziek en de taal R willekeurig combineren:

vitis show Muziek u: R

De vlag -n stelt ons in staat om «de juiste bestanden» uit het resultaat van de aanvraag te extraheren op basis van nummers en/of bereiken, bijvoorbeeld, -n 3-7, of iets complexer: -n 1,5,8-10,13. Het is vaak nuttig met de subopdracht open, waarmee je de benodigde bestanden uit de lijst kunt openen.

Categorieën in plaats van mappen, of een semantisch bestandssysteem voor Linux

Hoewel we ons dus verwijderen van het gebruik van een gewone hiërarchie van mappen, is het vaak handig om geneste categorieën te hebben. Laten we een subcategorie «Statistiek» aan de categorie «Wiskunde» toevoegen en deze categorie aan het bijpassende bestand toewijzen:

vitis create Wiskunde/Statistiek

vitis assign Wiskunde/Statistiek -v "R/Inleiding tot R.pdf"

vitis show Wiskunde --categories

Categorieën in plaats van mappen, of een semantisch bestandssysteem voor Linux

We kunnen zien dat dit bestand nu de categorie ‘Wiskunde/Statistiek’ heeft in plaats van ‘Wiskunde’ (overbodige links worden bijgehouden).

Het kan onhandig zijn om het volledige pad aan te geven, laten we een ‘globale’ alias maken:

vitis assign Wiskunde/Statistiek -a Statistiek

vitis show Statistiek

Categorieën in plaats van mappen, of een semantisch bestandssysteem voor Linux

Niet alleen reguliere bestanden

Internetlinks

Voor de uniformiteit van het opslaan van informatie zou het nuttig zijn om in ieder geval internetbronnen te categoriseren. En dat is mogelijk:

vitis assign Habr Kleuranomalie -i https://habr.com/nl/company/sfe_ru/blog/437304/ --yes

Op een speciale plaats wordt een bestand gecreëerd met de HTML-pagina titel en met de extensie .desktop. Dit is het traditionele formaat voor snelkoppelingen in GNU/Linux. Dergelijke snelkoppelingen krijgen automatisch de categorie NetworkBookmarks.

Natuurlijk worden snelkoppelingen gemaakt om gebruikt te worden:

vitis open Kleuranomalie

De uitvoering van de opdracht opent in de browser de zojuist opgeslagen link. Gecategoriseerde snelkoppelingen naar internetbronnen kunnen de functie van browserbladwijzers vervangen.

Bestandsfragmenten

Het is ook nuttig om categorieën te hebben voor afzonderlijke bestandsfragmenten. Niet slecht, hè? Maar de huidige implementatie raakt alleen gewone tekstbestanden, audio- en videobestanden aan. Stel dat je een bepaald stukje van een concert of een grappig moment in een film wilt markeren, dan kun je bij gebruik van assign de vlaggen —fragname, —start, —finish gebruiken. Laten we de intro van ‘Duck Tales’ bewaren:

vitis assign vitis assign -c Intro's -f Duck_Tales/s01s01.avi --finish 00:00:59 --fragname "Duck Tales intro"

vitis open Intro's

In werkelijkheid vindt er geen afkapping van bestanden plaats, in plaats daarvan wordt er een pointer-bestand op een fragment aangemaakt, waarin het type bestand, het pad naar het bestand, het begin- en eindpunt van het fragment zijn beschreven. De creatie en opening van pointers op fragmenten wordt gedelegeerd aan hulpprogramma's die speciaal voor deze doeleinden zijn gemaakt — dit zijn de mediafragmenter en fragplayer. De eerste maakt aan, de tweede opent. In het geval van audio- en video-opnames gebeurt het afspelen van een mediabestand van een bepaalde naar een bepaalde positie met behulp van de VLC-speler, dus die moet ook in het systeem aanwezig zijn. Eerst wilde ik dit gebaseerd op mplayer doen, maar daar was het om de een of andere reden nogal krom met positioneren op het juiste moment.
In ons voorbeeld wordt het bestand "Duck Tales intro.fragpointer" (het wordt op een specifieke locatie geplaatst) aangemaakt, en vervolgens wordt het fragment vanaf het begin van het bestand afgespeeld (omdat –start niet is opgegeven bij het maken) tot de markering op 59 seconden, waarna VLC sluit.

Een ander voorbeeld is dat we besloten hebben een afzonderlijke uitvoering op een concert van een bekende artiest te categoriseren:

vitis assign Лепс "Spasite nashi dushi" -f Grigory Leps - Concert Parus - nummers van Vladimir Vysotsky.mp4 --fragname "Spasite nashi dushi" --start 00:32:18 --finish 00:36:51

vitis open "Spasite nashi dushi"

Bij het openen zal het bestand op de juiste positie worden afgespeeld en na vier en een halve minuut sluiten.

Hoe dit alles werkt + extra mogelijkheden

Categorisatie opslag

Aan het begin van het doordenken van de organisatie van het semantische bestandssysteem kwamen er drie manieren in me op: door het opslaan van symbolische links, via een database, of door een beschrijving in XML. De eerste manier won, omdat deze enerzijds eenvoudig te implementeren is, en anderzijds de gebruiker de mogelijkheid biedt om de categorieën rechtstreeks vanuit het bestandssysteem te bekijken (wat handig en belangrijk is). Aan het begin van het gebruik vitis wordt er in de thuismap van de gebruiker een map "Vitis" en een configuratiebestand " .config/vitis/vitis.conf" aangemaakt. In ~/Vitis worden mappen aangemaakt die overeenkomen met de categorieën, en in deze categorie-mappen worden symbolische links naar de originele bestanden aangemaakt. De aliassen van de categorieën zijn ook gewoon links naar hen. Natuurlijk kan het bestaan van de "Vitis" map in de persoonlijke map voor sommigen ongewenst zijn. We kunnen overschakelen naar een andere locatie:

vitis service set path /mnt/MyFavoriteDisk/Vitis/

Op een zeker moment wordt het duidelijk dat het categoriseren van bestanden die op verschillende plaatsen verspreid zijn, weinig zinnig is, omdat hun locatie kan veranderen. Daarom heb ik in eerste instantie een map voor mezelf aangemaakt waar ik gewoon alles dumpte en dit alles categoriseerde. Toen besloot ik dat het goed zou zijn om dit op programm niveau vorm te geven. Zo ontstond het begrip "bestandruimte". Aan het begin van het gebruik vitis zou het meteen handig zijn om zo'n plek in te stellen (daar worden alle bestanden die we nodig hebben opgeslagen) en autosave in te schakelen:

vitis service add filespace /mnt/MyFavoriteDisk/Filespace/

vitis service set autosave yes

Zonder autosave bij het gebruik van de subopdracht «assign» is de vlag —save vereist als je de toevoeging van het bestand in de bestandsruimte wilt opslaan.

Bovendien kun je meerdere bestandsruimtes toevoegen en hun prioriteiten wijzigen, wat nuttig kan zijn wanneer er veel bestanden zijn die op verschillende media zijn opgeslagen. Hier zal ik deze mogelijkheid niet behandelen, details zijn te vinden in de handleiding van het programma.

Migratie van het semantische bestandssysteem

Hoe dan ook, de Vitis-directory en bestandsruimtes kunnen theoretisch af en toe van plaats veranderen. Om dit operationeel te maken, heb ik een aparte utility gecreëerd link-editor, die links massaal kan bewerken door delen van het pad door andere te vervangen:

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

In het eerste geval, nadat we zijn verhuisd van /mnt/MyFavoriteDisk/Vitis/ naar de thuismap, worden de symbolische links die zijn gerelateerd aan aliassen bewerkt. In het tweede geval worden na het wijzigen van de locatie van de bestandsruimte alle links in Vitis gewijzigd op basis van de wijzigingsaanvraag van hun pad.

Automatische categorieën

Als je het commando uitvoert vitis service get autocategorization, kun je zien dat standaard automatische categorie-indeling is ingesteld op basis van (Format en Type) en bestandsextensies (Extension).

Dit is nuttig wanneer je bijvoorbeeld iets moet vinden tussen PDF's of wilt zien wat je hebt opgeslagen in EPUB en FB2, je kunt gewoon de query uitvoeren

vitis show Format/MOBI u: Format/FB2

Het is zo gekomen dat de standaard tools van GNU/Linux zoals file of mimetype me niet tevredenstelden, omdat ze niet altijd het juiste formaat kunnen bepalen. Daarom heb ik een eigen implementatie gemaakt op basis van bestandssignaturen en extensies. Over het algemeen is het bepalen van bestandsformaten een interessant onderwerp voor onderzoek en verdient het een apart artikel. Voorlopig kan ik zeggen dat ik misschien niet voor alle bestandsformaten ter wereld een nauwkeurige herkenning heb voorzien, maar over het algemeen werkt het al behoorlijk goed. Helaas wordt het formaat voor EPUB momenteel als ZIP herkend (wat in wezen gerechtvaardigd is, maar in de praktijk niet als normaal gedrag moet worden beschouwd). Tot op zekere hoogte moet je deze mogelijkheid als experimenteel beschouwen; meld bugs. In vreemde situaties kan je altijd gebruik maken van categorieën op basis van bestandsextensies, bijvoorbeeld Extension/epub.

Als automatische categorieën op basis van formaat zijn ingeschakeld, zijn ook automatische categorieën ingeschakeld die bepaalde formaten combineren in typen zoals: 'Archieven', 'Afbeeldingen', 'Video', 'Audio' en 'Documenten'. Voor deze subcategorieën zullen ook gelokaliseerde namen worden gemaakt.

Waar niets over gezegd wordt

vitis is het een zeer veelzijdige tool geworden, en het is moeilijk om alles onmiddellijk te dekken. Ik zal kort vermelden wat je verder nog kunt doen:

  • categorieën kunnen worden verwijderd en van bestanden worden verwijderd;
  • de resultaten van verzoeken op basis van zoektermen kunnen in de opgegeven map worden gekopieerd;
  • bestanden kunnen worden uitgevoerd als programma's;
  • de show-commando heeft veel opties, bijvoorbeeld sorteren op naam/datum van wijziging of toegang/grootte/extensie, tonen van bestandskenmerken en paden naar originelen, inclusief weergeven van verborgen bestanden, enz.;
  • bij het opslaan van links naar internetbronnen kunnen ook lokale kopieën van HTML-pagina's worden opgeslagen.

Alle details zijn te vinden in de gebruikershandleiding.

Vooruitzichten

Sceptici zeggen vaak dat 'niemand deze tags zelf zal instellen'. Aan mijn voorbeeld kan ik het tegendeel bewijzen: ik heb al meer dan zesduizend bestanden gecategoriseerd, meer dan duizend categorieën en aliassen aangemaakt, en het was de moeite waard. Wanneer je met één commando vitis open Plan de lijst van je taken opent of wanneer je met één commando vitis open LaTeX het boek van Stolyarov over het typesettingsysteem LaTeX opent, wordt het moreel moeilijk om het besturingssysteem 'op de oude manier' te gebruiken.

Op deze basis ontstaat een reeks ideeën. Bijvoorbeeld, je zou een automatisch radiostation kunnen maken dat thematische muziek afspeelt op basis van het huidige weer, een feestdag, de dag van de week, het tijdstip van de dag of het seizoen. Een andere mogelijkheid is een muziekspeler die weet van categorieën en muziek kan afspelen op basis van expressies met operaties op categorieën als verzamelingen. Het zou nuttig zijn om een daemon te maken die de map 'Downloads' in de gaten houdt en nieuwe bestanden categoriseren voorstelt. En natuurlijk zou er een goede grafische semantische bestandsbeheerder moeten worden gemaakt. Ooit heb ik zelfs een webservice voor een bedrijf gemaakt voor het gezamenlijk gebruik van bestanden, maar het had geen prioriteit en werd verouderd, hoewel het een hoog niveau van functionaliteit bereikte. (Vanwege grote veranderingen in de zelf vitis, is het nu onbruikbaar.)

hier is een kleine demonstratie

Categorieën in plaats van mappen, of een semantisch bestandssysteem voor Linux

Conclusie

Vitis — is niet de eerste poging om de manier van werken met gegevens radicaal te veranderen, maar ik vond het belangrijk om mijn ideeën te realiseren en de implementatie openbaar te maken onder de GNU GPL-licentie. Voor gebruiksgemak is er een deb-pakket gemaakt voor x86-64, het zou moeten werken op alle moderne Debian-distributies. Op ARM waren er enkele complicaties (alle andere programma's die met vitis, functioneren echter normaal), maar later zal er ook een werkend pakket voor dit platform (armhf) worden samengesteld. Ik ben tijdelijk gestopt met het maken van RPM-pakketten vanwege problemen met Fedora 30 en de moeilijkheid om op meerdere RPM-distributies te focussen, maar later zullen er toch pakketten voor een paar van hen worden gemaakt. Tot die tijd kun je gebruik maken van make && make install of checkinstall.

Iedereen bedankt voor de aandacht! Ik hoop dat dit artikel en dit project nuttig zullen blijken.

Link naar de projectrepository

Bron: habr.com

Koop betrouwbare webhosting met bescherming tegen DDoS, VPS VDS servers 🔥 Koop betrouwbare webhosting met bescherming tegen DDoS, VPS VDS servers | ProHoster