Categorieën in plaats van mappen, of het Semantic File System voor Linux

Dataclassificatie zelf is een interessant onderzoeksonderwerp. Ik verzamel graag informatie die nodig lijkt, en ik heb altijd geprobeerd logische maphiërarchieën voor mijn bestanden te creëren, en op een dag zag ik in een droom een ​​mooi en handig programma om tags aan bestanden toe te wijzen, en ik besloot dat ik niet meer kon leven. nog langer zo.

Het probleem van hiërarchische bestandssystemen

Gebruikers worden vaak geconfronteerd met het probleem bij het kiezen waar ze het volgende nieuwe bestand willen opslaan en het probleem bij het vinden van hun eigen bestanden (soms zijn bestandsnamen helemaal niet bedoeld om door iemand te worden onthouden).

Een uitweg uit deze situatie kunnen semantische bestandssystemen zijn, die meestal een aanvulling zijn op het traditionele bestandssysteem. De mappen daarin worden vervangen door semantische attributen, ook wel tags, categorieën en metadata genoemd. Ik zal de term “categorie” vaker gebruiken, omdat... In de context van bestandssystemen is het woord "tag" soms een beetje vreemd, vooral wanneer "subtags" en "tagaliassen" verschijnen.

Door categorieën aan bestanden toe te wijzen, wordt het probleem van het opslaan en zoeken naar een bestand grotendeels geëlimineerd: als u zich ten minste één van de categorieën herinnert die aan een bestand zijn toegewezen, zal het bestand nooit uit het zicht verdwijnen.

Eerder is dit onderwerp meer dan eens aan de orde gesteld op Habré (tijd, два, drie, четыре etc.), hier beschrijf ik mijn oplossing.

Pad naar realisatie

Direct na de genoemde droom beschreef ik in mijn notitieboekje de opdrachtinterface die met categorieën voor het nodige werk zorgt. Toen besloot ik dat ik over een week of twee een prototype kon schrijven met Python of Bash, en dan zou ik moeten werken aan het maken van een grafische shell in Qt of GTK. De realiteit bleek, zoals altijd, veel harder en de ontwikkeling werd vertraagd.

Het oorspronkelijke idee was om allereerst een programma te maken met een handige en beknopte opdrachtregelinterface waarmee categorieën konden worden gemaakt, verwijderd, categorieën aan bestanden konden worden toegewezen en categorieën uit bestanden konden worden verwijderd. Ik heb het programma gebeld Fluisteren.

Eerste poging om te creëren Fluisteren eindigde op niets, omdat er veel tijd aan werk en studie werd besteed. De tweede poging was al iets: voor de masterproef slaagde ik erin het geplande project te voltooien en zelfs een prototype van de GTK-schaal te maken. Maar die versie bleek zo onbetrouwbaar en onhandig dat er veel moest worden heroverwogen.

Ik heb de derde versie zelf heel lang gebruikt, nadat ik enkele duizenden van mijn bestanden naar categorieën had overgebracht. Dit werd ook enorm vergemakkelijkt door de geïmplementeerde bash-voltooiing. Maar sommige problemen, zoals het ontbreken van automatische categorieën en de mogelijkheid om bestanden met dezelfde naam op te slaan, bleven bestaan, en het programma was al gebukt onder zijn eigen complexiteit. Zo kwam ik tot de noodzaak om complexe softwareontwikkelingsproblemen op te lossen: gedetailleerde vereisten schrijven, een functioneel testsysteem ontwikkelen, verpakkingsinstructies bestuderen en nog veel meer. Ik ben nu tot mijn plan gekomen, zodat deze bescheiden creatie aan de vrije gemeenschap kan worden gepresenteerd. Specifiek bestandsbeheer, zoals het beheer via het concept van categorieën, roept onverwachte problemen en problemen op, en bij het oplossen ervan Fluisteren heeft nog vijf projecten rondom zichzelf voortgebracht, waarvan sommige in het artikel zullen worden genoemd. Tot nu Fluisteren Ik heb geen grafische shell gekocht, maar het gemak van het gebruik van bestandscategorieën vanaf de opdrachtregel weegt voor mij al op tegen de voordelen van een gewone grafische bestandsbeheerder.

Gebruiksvoorbeelden

Laten we eenvoudig beginnen: maak een categorie:

vitis create Музыка

Laten we er als voorbeeld wat compositie aan toevoegen:

vitis assign Музыка -f "The Ink Spots - I Don't Want To Set The World On Fire.mp3"

U kunt de inhoud van de categorie “Muziek” bekijken met behulp van het subcommando “show”:

vitis show Музыка

Je kunt het spelen met het subcommando "open".

vitis open Музыка

Omdat Als we slechts één bestand in de categorie "Muziek" hebben, wordt alleen dat bestand gestart. Om bestanden met hun standaardprogramma's te openen, heb ik een apart hulpprogramma gemaakt vts-fs-open (standaardtools zoals xdg-open of mimeopen bevielen mij om een ​​aantal redenen niet; maar in ieder geval kun je in de instellingen een ander hulpprogramma opgeven voor het universeel openen van bestanden). Dit hulpprogramma werkt goed op verschillende distributies met verschillende werkomgevingen, dus ik raad aan om het samen met vitis te installeren.

U kunt ook rechtstreeks het programma opgeven om bestanden te openen:

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

Categorieën in plaats van mappen, of het Semantic File System voor Linux

Laten we meer categorieën maken en bestanden toevoegen met behulp van “toewijzen”. Als bestanden worden toegewezen aan categorieën die nog niet bestaan, wordt u gevraagd deze te maken. Een onnodig verzoek kan worden vermeden door de vlag -yes te gebruiken.

vitis assign Программирование R -f "Введение в R.pdf" "Статистический пакет R: теория вероятностей и матстатистика.pdf" --yes

Nu willen we de categorie “Wiskunde” toevoegen aan het bestand “Statistisch pakket R: waarschijnlijkheidstheorie en wiskundige statistiek.pdf”. We weten dat dit bestand al is gecategoriseerd als "R" en daarom kunnen we het categoriepad van het Vitis-systeem gebruiken:

vitis assign Математика -v "R/Статистический пакет R: теория вероятностей и матстатистика.pdf"

Gelukkig maakt bash-voltooiing dit gemakkelijk.

Laten we eens kijken wat er gebeurde. Gebruik de vlag --categories om een ​​lijst met categorieën voor elk bestand te zien:

vitis show R --categories

Categorieën in plaats van mappen, of het Semantic File System voor Linux

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

Laten we voor de afwisseling nog iets toevoegen aan ‘Wiskunde’:

vitis assign Математика -f "Математический анализ - 1984.pdf" Перельман_Занимательная_математика_1927.djvu 

En nu wordt het interessant. In plaats van categorieën kunt u uitdrukkingen schrijven met de bewerkingen samenvoegen, snijden en aftrekken, dat wil zeggen bewerkingen op verzamelingen gebruiken. De kruising van "Wiskunde" met "R" resulteert bijvoorbeeld in één bestand.

vitis show R i: Математика

Laten we verwijzingen naar de taal “R” aftrekken van “Wiskunde”:

vitis show Математика  R  #или vitis show Математика c: R

We kunnen doelloos muziek en de R-taal combineren:

vitis show Музыка u: R

Met de vlag -n kunt u de vereiste bestanden uit het verzoekresultaat halen op basis van getallen en/of bereiken, bijvoorbeeld: -n 3-7, of iets ingewikkelder: -n 1,5,8-10,13. Vaak is dit handig bij het subcommando open, waarmee je de gewenste bestanden uit een lijst kunt openen.

Categorieën in plaats van mappen, of het Semantic File System voor Linux

Hoewel we afstappen van het gebruik van een conventionele directoryhiërarchie, is het vaak handig om geneste categorieën te hebben. Laten we een subcategorie ‘Statistieken’ maken onder de categorie ‘Wiskunde’ en deze categorie toevoegen aan het juiste bestand:

vitis create Математика/Статистика

vitis assign Математика/Статистика -v "R/Введение в R.pdf"

vitis show Математика --categories

Categorieën in plaats van mappen, of het Semantic File System voor Linux

We kunnen zien dat dit bestand nu de categorie “Wiskunde/Statistieken” heeft in plaats van “Wiskunde” (extra links worden bijgehouden).

Het kan lastig zijn om het volledige pad te adresseren. Laten we een 'algemene' alias maken:

vitis assign Математика/Статистика -a Статистика

vitis show Статистика

Categorieën in plaats van mappen, of het Semantic File System voor Linux

Niet alleen gewone bestanden

Internetlinks

Om de opslag van informatie te verenigen, zou het op zijn minst nuttig zijn om links naar internetbronnen te categoriseren. En dit is mogelijk:

vitis assign Хабр Цветоаномалия -i https://habr.com/ru/company/sfe_ru/blog/437304/ --yes

Er wordt op een speciale plaats een bestand aangemaakt met de header van de HTML-pagina en de extensie .desktop. Dit is het traditionele snelkoppelingsformaat in GNU/Linux. Dergelijke snelkoppelingen worden automatisch gecategoriseerd als NetworkBookmarks.

Uiteraard zijn er snelkoppelingen gemaakt om te gebruiken:

vitis open Цветоаномалия

Als u de opdracht uitvoert, wordt de nieuw opgeslagen link in de browser geopend. Gecategoriseerde snelkoppelingen naar internetbronnen kunnen dienen als vervanging voor browserbladwijzers.

Bestandsfragmenten

Het is ook handig om categorieën te hebben voor individuele bestanden. Geen slecht verzoek, toch? Maar de huidige implementatie heeft tot nu toe alleen betrekking op platte tekstbestanden, audio- en videobestanden. Stel dat u een bepaald deel van een concert of een grappig moment in een film wilt markeren, dan kunt u bij het gebruik van 'assign' de vlaggen -fragname, -start, -finish gebruiken. Laten we de screensaver van "DuckTales" opslaan:

vitis assign vitis assign -c Заставки -f Duck_Tales/s01s01.avi --finish 00:00:59 --fragname "Duck Tales intro"

vitis open Заставки

In werkelijkheid vindt er geen bestandsknipsel plaats; in plaats daarvan wordt een pointerfile naar het fragment gemaakt, dat het bestandstype, het pad naar het bestand en het begin en einde van het fragment beschrijft. Het maken en openen van verwijzingen naar fragmenten is gedelegeerd aan hulpprogramma's die ik speciaal voor deze doeleinden heb gemaakt - dit zijn mediafragmenter en fragplayer. De eerste creëert, de tweede opent. Bij audio- en video-opnamen wordt het mediabestand via de VLC-speler van een bepaalde naar een bepaalde positie gelanceerd en moet dus ook in het systeem staan. In eerste instantie wilde ik dit doen op basis van mplayer, maar om de een of andere reden was het erg scheef met positionering op het juiste moment.
In ons voorbeeld wordt het bestand “Duck Tales intro.fragpointer” gemaakt (het wordt op een speciale plaats geplaatst) en vervolgens wordt een fragment afgespeeld vanaf het begin van het bestand (aangezien –start niet was opgegeven bij het maken) tot de 59 tweede punt, waarna VLC sluit.

Een ander voorbeeld is toen we besloten een enkel optreden tijdens een concert van een beroemde artiest te categoriseren:

vitis assign Лепс "Спасите наши души" -f Григорий Лепc - Концерт Парус - песни Владимира Высоцкого.mp4 --fragname "Спасите наши души" --start 00:32:18 --finish 00:36:51

vitis open "Спасите наши души"

Bij het openen wordt het bestand op de gewenste positie opgenomen en na vier en een halve minuut gesloten.

Hoe het allemaal werkt + extra functies

Categorieën opslaan

Helemaal aan het begin van het nadenken over het organiseren van een semantisch bestandssysteem kwamen drie manieren in me op: door de opslag van symbolische links, via een database, via een beschrijving in XML. De eerste methode won, omdat... aan de ene kant is het eenvoudig te implementeren en aan de andere kant heeft de gebruiker de mogelijkheid om rechtstreeks vanuit het bestandssysteem naar categorieën te kijken (en dit is handig en belangrijk). Aan het begin van gebruik Fluisteren De map “Vitis” en het configuratiebestand “.config/vitis/vitis.conf” worden aangemaakt in de thuismap van de gebruiker. Mappen die overeenkomen met categorieën worden gemaakt in ~/Vitis, en symbolische koppelingen naar de originele bestanden worden in deze categoriemappen gemaakt. Categorie-aliassen zijn ook slechts links ernaartoe. Natuurlijk is de aanwezigheid van de map “Vitis” in de thuismap voor sommige mensen misschien niet geschikt. We kunnen overstappen naar elke andere locatie:

vitis service set path /mnt/MyFavoriteDisk/Vitis/

Op een gegeven moment wordt het duidelijk dat het weinig zin heeft om bestanden die verspreid zijn over verschillende plaatsen te categoriseren, omdat hun locatie kan veranderen. Daarom heb ik om te beginnen een map voor mezelf gemaakt, waar ik domweg alles heb gedumpt en alle categorieën heb gegeven. Toen besloot ik dat het leuk zou zijn om dit moment op programmaniveau te formaliseren. Dit is hoe het concept van “bestandsruimte” verscheen. Aan het begin van gebruik Fluisteren Het kan geen kwaad om zo’n locatie onmiddellijk in te stellen (alle bestanden die we nodig hebben worden daar opgeslagen) en automatisch opslaan in te schakelen:

vitis service add filespace /mnt/MyFavoriteDisk/Filespace/

vitis service set autosave yes

Zonder automatisch opslaan is bij gebruik van het subcommando "assign" de vlag --save vereist als u het toegevoegde bestand in de bestandsruimte wilt opslaan.

Bovendien kunt u meerdere bestandsruimten toevoegen en hun prioriteiten wijzigen; dit kan handig zijn als er veel bestanden zijn en deze op verschillende media zijn opgeslagen. Ik zal deze mogelijkheid hier niet overwegen; details zijn te vinden in de programmahulp.

Semantische bestandssysteemmigratie

Hoe dan ook, de Vitis-directory en bestandsruimten kunnen theoretisch soms van plaats naar plaats bewegen. Om het te laten werken, heb ik een apart hulpprogramma gemaakt link-editor, waarmee links in bulk kunnen worden bewerkt en delen van het pad door andere kunnen worden 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 worden, nadat we van /mnt/MyFavoriteDisk/Vitis/ naar de homedirectory zijn verhuisd, de symbolische links die aan de aliassen zijn gekoppeld, bewerkt. In het tweede geval worden, na het wijzigen van de locatie van de bestandsruimte, alle links in Vitis gewijzigd in nieuwe in overeenstemming met het verzoek om een ​​deel van hun pad te vervangen.

Automatische categorieën

Als u de opdracht uitvoert vitis service get autocategorization, kunt u zien dat standaard automatische categorieën worden toegewezen op basis van formaat (Formaat en Type) en bestandsextensie (Extensie).

Dit is handig als u bijvoorbeeld iets tussen PDF's moet zoeken of wilt kijken naar wat u vanuit EPUB en FB2 hebt opgeslagen. U kunt eenvoudigweg het verzoek uitvoeren

vitis show Format/MOBI u: Format/FB2

Het gebeurde zo dat standaard GNU/Linux-tools zoals file- of mimetype niet precies bij mij pasten omdat ze het formaat niet altijd correct bepalen; ik moest mijn eigen implementatie maken op basis van bestandshandtekeningen en extensies. Over het algemeen is het onderwerp van het definiëren van bestandsformaten een interessant onderwerp voor onderzoek en verdient het een apart artikel. Voor nu kan ik zeggen dat ik misschien niet voor alle formaten ter wereld echte erkenning heb gegeven, maar over het algemeen werkt het al goed. Het is waar dat EPUB het formaat nu als ZIP definieert (over het algemeen is dit gerechtvaardigd, maar in de praktijk mag dit niet als normaal gedrag worden beschouwd). Beschouw deze functie voorlopig als experimenteel en rapporteer eventuele bugs. In vreemde situaties kunt u altijd bestandsextensiecategorieën gebruiken, bijvoorbeeld Extensie/epub.

Als automatische categorieën op formaat zijn ingeschakeld, zijn ook automatische categorieën ingeschakeld die bepaalde indelingen op type groeperen: “Archieven”, “Afbeeldingen”, “Video”, “Audio” en “Documenten”. Voor deze subcategorieën worden ook gelokaliseerde namen gemaakt.

Wat wordt er niet gezegd

Fluisteren Het bleek een zeer veelzijdige tool te zijn, en het is moeilijk om alles in één keer te behandelen. Ik zal kort vermelden wat u nog meer kunt doen:

  • categorieën kunnen worden verwijderd en verwijderd uit bestanden;
  • de resultaten van expressiequery's kunnen naar de opgegeven map worden gekopieerd;
  • bestanden kunnen als programma's worden uitgevoerd;
  • Het show-commando heeft veel opties, bijvoorbeeld sorteren op naam/datum van wijziging of toegang/grootte/extensie, het tonen van bestandseigenschappen en paden naar originelen, het inschakelen van de weergave van verborgen bestanden, enz.;
  • Wanneer u koppelingen naar internetbronnen opslaat, kunt u ook lokale kopieën van HTML-pagina's opslaan.

Volledige details vindt u in de gebruikershelp.

Vooruitzichten

Sceptici zeggen vaak dat “niemand deze tags zelf zal instellen.” Met mijn eigen voorbeeld kan ik het tegendeel bewijzen: ik heb al meer dan zesduizend bestanden gecategoriseerd, meer dan duizend categorieën en aliassen gemaakt, en het was het waard. Wanneer één ploeg vitis open План open uw takenlijst of wanneer met één opdracht vitis open LaTeX Als je Stolyarovs boek over het LaTeX-opmaaksysteem openslaat, is het moreel al moeilijk om het bestandssysteem ‘op de ouderwetse manier’ te gebruiken.

Op basis hiervan ontstaan ​​een aantal ideeën. U kunt bijvoorbeeld een automatische radio maken die thematische muziek inschakelt op basis van het huidige weer, de vakantie, de dag van de week, het tijdstip van de dag of het jaar. Nog dichter bij het onderwerp is een muziekspeler die verstand heeft van categorieën en muziek kan afspelen op basis van expressie met bewerkingen op categorieën en op sets. Het is handig om een ​​daemon te maken die de map "Downloads" bewaakt en aanbiedt nieuwe bestanden te categoriseren. En natuurlijk moeten we een normale grafische semantische bestandsbeheerder maken. Ooit heb ik zelfs een webservice voor de onderneming gemaakt voor het collectieve gebruik van bestanden, maar het had geen prioriteit en werd irrelevant, hoewel het een hoog prestatieniveau behaalde. (Vanwege grote veranderingen in de Fluisteren, het is niet langer bruikbaar.)

hier is een kleine demo

Categorieën in plaats van mappen, of het Semantic File System voor Linux

Conclusie

vitis is niet de eerste poging om de stijl van werken met data radicaal te veranderen, maar ik vond het belangrijk om mijn ideeën te implementeren en de implementatie publiekelijk beschikbaar te maken onder de GNU GPL-licentie. Voor het gemak is er een deb-pakket gemaakt voor x86-64; het zou op alle moderne Debian-distributies moeten werken. Er waren kleine problemen met ARM (terwijl alle andere programma's verband hielden met Fluisteren, werkt prima), maar in de toekomst zal er een werkpakket voor dit platform worden samengesteld (armhf). Ik ben voorlopig gestopt met het maken van RPM-pakketten vanwege problemen op Fedora 30 en de moeilijkheid om over veel RPM-distributies te verspreiden, maar latere pakketten zullen nog steeds voor minstens een paar daarvan worden gemaakt. In de tussentijd kunt u gebruiken make && make install of checkinstall.

Bedankt allemaal voor jullie aandacht! Ik hoop dat dit artikel en dit project nuttig kunnen zijn.

Link naar projectrepository

Bron: www.habr.com

Voeg een reactie