Data classification is, in itself, an interesting topic for research. I enjoy collecting information that seems necessary and have always tried to create logical hierarchies of directories for my files. Once, I dreamed of a beautiful and convenient program for assigning tags to files, and I decided that I could no longer live this way.
The problem of hierarchical file systems
Users often face the problem of deciding where to save the next new file and the challenge of finding their own files (sometimes the file names are not even meant to be remembered by a person).
A solution to this issue can be semantic file systems, which are usually an extension of the traditional file system. Directories are replaced with semantic attributes, also known as tags, categories, or metadata. I will more often use the term 'category' since, in the context of file systems, the word 'tag' sometimes sounds odd, especially when 'sub-tags' and 'tag aliases' come into play.
Assigning categories to files significantly alleviates issues of storage and file retrieval: if you remember (or at least suspect) even one of the categories assigned to a file, the file will never be lost from view.
This topic has been raised several times on Habr (, , , and others), here I describe my solution.
The path to implementation
Right after the mentioned dream, I outlined in a notebook a command-line interface that would enable the necessary work with categories. Back then, I thought I could write a prototype in a week or two using Python or Bash, and later work on creating a graphical interface with Qt or GTK. Reality, as always, turned out to be much harsher, and the development took longer.
The initial idea was primarily to create a program with a user-friendly and concise command-line interface that would allow creating and deleting categories, assigning categories to files, and removing categories from files. I named the program vitis.
The first attempt to create vitis endte uden resultater, da der blev brugt meget tid på arbejde og universitetet. Det andet forsøg var allerede noget: jeg lykkedes med at afslutte det projekt, jeg havde tænkt mig til min kandidatopgave, og endda lave en prototype af GTK-grænsefladen. Men den version viste sig at være så usikker og ubehagelig, at jeg måtte genoverveje meget.
Jeg brugte den tredje version i meget lang tid selv og kategoriserede flere tusinde af mine filer. Dette blev i høj grad faciliteret af det implementerede autoudfyld i bash. Men nogle problemer, såsom manglen på automatiske kategorier og muligheden for at gemme filer med samme navn, forblev stadig, og programmet var allerede ved at bukke under for sin egen kompleksitet. Så jeg indså behovet for at løse problemerne med udviklingen af kompliceret software: at skrive detaljerede krav, udvikle et funktionelt testsystem, studere pakkeinstruktioner og meget mere. Nu er jeg nået til det ønskede, så dette beskedne værk kan præsenteres for det frie fællesskab. Sådan en specifik filhåndtering, som håndtering gennem konceptet kategorier, rejser uventede spørgsmål og problemer, og i løsningen af dem vitis skabte fem yderligere projekter omkring sig, nogle af dem vil blive nævnt i artiklen. Indtil i dag vitis har jeg ikke erhvervet en grafisk grænseflade, men brugervenligheden ved filkategorier fra kommandolinjen overstiger allerede for mig enhver fordel ved en almindelig grafisk filhåndter.
Eksempler på brug
Lad os starte simpelt — lad os oprette en kategori:
vitis create MusikLad os tilføje et eksempelnummer til den:
vitis assign Musik -f "The Ink Spots - I Don't Want To Set The World On Fire.mp3"Indholdet af kategorien «Musik» kan ses med underkommandoen «show»:
vitis show MusikDen kan afspilles med underkommandoen «open»
vitis open MusikDa vi kun har én fil i kategorien «Musik», vil kun denne blive startet. For at åbne filer med deres standardprogrammer har jeg lavet et separat værktøj vts-fs-open (standardværktøjer som xdg-open eller mimeopen tilfredsstillede mig af forskellige årsager ikke; men hvis det er nødvendigt, kan du i indstillingerne angive et andet værktøj til universal åbning af filer). Dette værktøj fungerer godt på forskellige distributioner med forskellige skriveborde, så jeg anbefaler at installere det sammen med vitis.
Du kan også angive programmet til at åbne filer direkte:
vitis open Musik --app qmmp
Lad os oprette flere kategorier og tilføje filer ved hjælp af «assign». Hvis filer tildeles ikke-eksisterende kategorier, vil der blive anmodet om deres oprettelse. Du kan undgå en unødvendig anmodning ved at bruge flaget —yes.
vitis assign Programmering R -f "Introduktion til R.pdf" "Statistikpakken R: sandsynlighedsteori og matematisk statistik.pdf" --yesNu vil vi tilføje filen «Statistikpakken R: sandsynlighedsteori og matematisk statistik.pdf» til kategorien «Matematik». Vi ved, at denne fil allerede har kategorien «R», og derfor kan vi bruge kategorivejen fra Vitis-systemet:
vitis assign Matematik -v "R/Statistikpakken R: sandsynlighedsteori og matematisk statistik.pdf"Heldigvis gør bash-autocomplete dette nemt.
Lad os se, hvad vi har fået, ved at bruge flaget —categories for at se listen over kategorier for hver fil:
vitis show R --categories
Bemærk, at filerne også blev tildelt automatiske kategorier baseret på format, type (som kombinerer formater) og filudvidelser. Disse kategorier kan deaktiveres, hvis ønskes. Senere vil jeg helt sikkert lave en lokalisering af deres navne.
Lad os tilføje noget andet til «Matematik» for variation:
vitis assign Matematik -f "Matematisk analyse - 1984.pdf" Perelman_Sjov_matematik_1927.djvu Og nu begynder det interessante. I stedet for kategorier kan du skrive udtryk med operationer for forening, snit og differens, dvs. bruge mængdeoperationer. For eksempel vil snittet mellem «Matematik» og «R» resultere i én fil.
vitis show R i: MatematikLad os trække omtalerne af sproget «R» fra «Matematik»:
vitis show Matematik R #eller vitis show Matematik c: RVi kan tilfældigt forene musik og sprog R:
vitis show Musik u: RFlaget -n tillader at «udtrække» de nødvendige filer fra resultatet af forespørgslen ved hjælp af numre og/eller intervaller, for eksempel, -n 3-7, eller mere komplekst: -n 1,5,8-10,13. Det er ofte nyttigt med underkommandoen open, som gør det muligt at åbne de nødvendige filer fra listen.

Selvom vi bevæger os væk fra at bruge den almindelige hierarkiske struktur for mapper, er det ofte nyttigt at have indlejrede kategorier. Lad os oprette en underkategori «Statistik» under kategorien «Matematik» og tilføje denne kategori til den passende fil:
vitis create Matematik/Statistik
vitis assign Matematik/Statistik -v "R/Introduktion til R.pdf"
vitis show Matematik --kategorier
Vi kan se, at denne fil nu har kategorien "Matematik/Statistik" i stedet for "Matematik" (overflødige links spores).
At henvise til den fulde sti kan være besværligt, lad os oprette et "globalt" alias:
vitis assign Matematik/Statistik -a Statistik
vitis show Statistik
Ikke kun almindelige filer
Internetsider
For at ensarte opbevaringen af enhver information ville det være nyttigt at kategorisere links til internetressourcer som minimum. Og dette er muligt:
vitis assign Habr Farveanomalitet -i https://habr.com/ru/company/sfe_ru/blog/437304/ --yesPå et særligt sted vil en fil med titlen på HTML-siden og med filendelse .desktop blive oprettet. Dette er et traditionelt format for genveje i GNU/Linux. Sådanne genveje får automatisk kategorien NetworkBookmarks.
Naturligvis bliver genveje oprettet for at blive brugt:
vitis open FarveanomalitetUdførelsen af kommandoen åbner det netop gemte link i browseren. Kategoriserede genveje til internetkilder kan fungere som erstatning for browserbogmærker.
Filfragmenter
Det er også nyttigt at have kategorier for individuelle filfragmenter. Ikke en dårlig idé, vel? Men den nuværende implementering berører kun almindelige tekstfiler, audio- og videofiler. Lad os sige, du har brug for at markere et bestemt stykke fra et koncert eller et sjovt øjeblik fra en film, så ved brug af assign kan du benytte flagene —fragname, —start, —finish. Lad os gemme introen fra "DuckTales":
vitis assign vitis assign -c Introer -f Duck_Tales/s01s01.avi --finish 00:00:59 --fragname "Duck Tales intro"
vitis open IntroerDer sker reelt ingen klipning af filer, i stedet oprettes en pegefiler til fragmentet, der beskriver filtypen, stien til filen, start- og slutpunktet for fragmentet. Oprettelse og åbning af pegepunkter på fragmenter delegers til værktøjer, som jeg specifikt har lavet til dette formål — det er mediafragmenter og fragplayer. Den første opretter, den anden åbner. I tilfælde af audio- og videooptagelser sker afspilningen af mediefilen fra et bestemt tidspunkt til et andet ved hjælp af VLC-afspilleren, så den skal også være i systemet. Jeg ville først gøre dette baseret på mplayer, men der var på en eller anden måde meget problematisk med positioning på det rigtige tidspunkt.
I vores eksempel oprettes der en fil "Duck Tales intro.fragpointer" (den placeres et særligt sted), og derefter afspilles et fragment fra begyndelsen af filen (da —start ikke blev angivet ved oprettelsen) til mærket ved 59 sekunder, hvorefter VLC lukkes.
Et andet eksempel er, at vi har besluttet at kategorisere en enkelt optræden ved en koncert med en kendt kunstner:
vitis assign Лепс "Спасите наши души" -f Григорий Лепc - Koncert Pарус - sange af Vladimir Vysotsky.mp4 --fragname "Спасите наши души" --start 00:32:18 --finish 00:36:51
vitis open "Спасите наши души"Når filen åbnes, vil den være inkluderet på den ønskede position og lukke efter fire og et halvt minut.
Hvordan det hele fungerer + yderligere muligheder
Opbevaring af kategorier
I begyndelsen af planlægningen af den semantiske filsystemorganisation kom jeg på tre metoder: gennem opbevaring af symbolske links, via en database, gennem beskrivelse i XML. Den første metode vandt, da den på den ene side er enkel at implementere, og på den anden side giver brugeren mulighed for at se kategorierne direkte fra filsystemet (og det er praktisk og vigtigt). I begyndelsen af brugen vitis oprettes der i brugerens hjemmemappe en mappe "Vitis" og en konfigurationsfil ".config/vitis/vitis.conf". I ~/Vitis oprettes der mapper, der svarer til kategorierne, og i disse kategorimapper oprettes der symbolske links til de originale filer. Kategorialiaser er også blot links til dem. Selvfølgelig kan tilstedeværelsen af mappen "Vitis" i hjemmebiblioteket være uacceptabelt for nogle. Vi kan skifte til et andet sted:
vitis service set path /mnt/MyFavoriteDisk/Vitis/På et bestemt tidspunkt bliver det klart, at det er meningsløst at kategorisere filer, der er spredt på forskellige steder, da deres placering kan ændre sig. Derfor oprettede jeg i første omgang en mappe, hvor jeg simpelthen smed alt og gav det alle kategorier. Derefter besluttede jeg, at det ville være godt at indføre dette koncept på programniveau. Dermed blev begrebet "filrum" introduceret. I begyndelsen af brugen vitis ville det bestemt ikke være dårligt at konfigurere et sted (hvor alle de nødvendige filer vil blive opbevaret) og aktivere automatisk gemming:
vitis service add filespace /mnt/MyFavoriteDisk/Filespace/
vitis service set autosave yesUden autosave ved brug af underkommandoen «assign» vil det være nødvendigt at angive flaget —save, hvis du ønsker at gemme den tilføjede fil i filsystemet.
Desuden kan man tilføje flere filsystemer og ændre deres prioriteter, hvilket kan være nyttigt, når der er mange filer, der opbevares på forskellige medier. Her vil jeg ikke gennemgå denne mulighed, detaljer kan læses i programmets hjælp.
Migration af semantisk filsystem
På den ene eller anden måde kan mappen Vitis og filsystemerne teoretisk flytte rundt. For at bringe det til funktion oprettede jeg et separat værktøj link-editor, som kan redigere links i bulk ved at erstatte dele af stien med andre:
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 -RI det første tilfælde, efter at vi er flyttet fra /mnt/MyFavoriteDisk/Vitis/ til hjemmebiblioteket, redigeres de symbolske links, der er relateret til aliasene. I det andet tilfælde efter ændringen af placeringen af filsystemet ændres alle links i Vitis til de nye i henhold til anmodningen om at erstatte dele af deres sti.
Automatiske kategorier
Hvis du kører kommandoen vitis service get autocategorization, kan du se, at der som standard er indstillet automatisk tildeling af kategorier efter format (Format og Type) og filudvidelse (Extension).
Dette er nyttigt, når du for eksempel skal finde noget blandt PDF-filer eller se, hvad du har gemt af EPUB og FB2, kan du blot udføre anmodningen
vitis show Format/MOBI u: Format/FB2Det er sket, at de standardværktøjer, som GNU/Linux tilbyder, som file eller mimetype ikke har været tilfredsstillende for mig, fordi de ikke altid korrekt bestemmer formatet. Jeg måtte derfor lave en egen implementering baseret på filsiganturer og udvidelser. Generelt er emnet for bestemmelse af filformater et interessant forskningsområde og fortjener en egen artikel. Indtil videre kan jeg sige, at jeg muligvis ikke har sikret nøjagtig genkendelse for alle formater i verden, men det fungerer allerede temmelig godt. Desuden identificeres EPUB-filer i øjeblikket som ZIP (hvilket i det store hele er berettiget, men i praksis skal dette ikke betragtes som normalt). Indtil videre skal du betragte denne mulighed som eksperimentel og rapportere om fejl. I mærkelige situationer kan du altid bruge kategorier baseret på filudvidelser, for eksempel Extension/epub.
Hvis automatiske kategorier efter format er aktiveret, er der også automatiske kategorier, der sammenfører nogle formater i typer såsom: 'Arkiver', 'Billeder', 'Video', 'Audio' og 'Dokumenter'. For disse underkategorier vil der også blive lavet lokaliserede navne.
Hvad der ikke er nævnt
vitis er blevet et meget alsidigt værktøj, og det er svært at dække alt på én gang. Kort nævner jeg, hvad der også kan gøres:
- kategorier kan slettes og fjernes fra filer;
- resultaterne af forespørgsler kan kopieres til den angivne mappe;
- filer kan køres som programmer;
- kommandoen show har mange indstillinger, f.eks. sortering efter navn/dato for ændringer eller adgang/størrelse/udvidelse, visning af filers egenskaber og stier til originalerne, medtagelse af visning af skjulte filer osv.;
- ved gemming af links til internetkilder kan der også gemmes lokale kopier af HTML-sider.
Alle detaljer kan findes i brugerdokumentationen.
Udsigter
Ofte siger skeptikere, at 'ingen vil sætte disse tags selv'. Jeg kan bevise det modsatte ud fra min egen erfaring: jeg har allerede kategoriseret mere end seks tusinde filer, oprettet over tusinde kategorier og aliaser, og det var det værd. Når man med én kommando vitis open Plan åbner listen over sine opgaver, eller når man med én kommando vitis open LaTeX åbner Stolyarovs bog om typesettingsystemet LaTeX, bliver det psykologisk svært at bruge filsystemet 'på den gamle måde'.
På denne baggrund opstår der en række idéer. For eksempel kunne man lave et automatiseret radio, der spiller temamusik i overensstemmelse med det aktuelle vejr, helligdage, ugedage, tid på døgnet eller året. Nærliggende emner inkluderer en musikafspiller, der kender til kategorier og kan afspille musik ud fra udtryk med operationer på kategorier som mængder. Det ville være nyttigt at lave et dæmon, der overvåger mappen «Downloads» og tilbyder at kategorisere nye filer. Og selvfølgelig bør man lave en ordentlig grafisk semantisk filhåndtering. Engang lavede jeg endda en webservice for virksomheden til fælles filbrug, men den var ikke prioriteret og blev uaktuel, selvom den nåede et højt niveau af funktionalitet. (I forbindelse med store ændringer i selve vitis, er den ikke længere brugbar.)
her er en lille demonstration

Konklusion
Vitis — ikke første forsøg på radikalt at ændre måden at arbejde med data på, men jeg mente, det var vigtigt at realisere mine ideer og offentliggøre implementeringen under GNU GPL-licensen. For nemheds skyld er der lavet en deb-pakke til x86-64, den bør fungere på alle moderne Debian-distributioner. Der viste sig at være små vanskeligheder på ARM (men alle andre programmer relateret til vitis, fungerer fint), men senere vil der også blive samlet en fungerende pakke til denne platform (armhf). Jeg er midlertidigt stoppet med at lave RPM-pakker på grund af problemer med Fedora 30 og det vanskelige i at dele mig ud på mange RPM-distributioner, men senere vil der blive lavet pakker til et par af dem. Indtil da kan man bruge make && make install eller checkinstall.
Tak for opmærksomheden! Jeg håber, denne artikel og dette projekt vil vise sig at være nyttige.
Kilde: habr.com
