Data classification is 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. One night, I dreamt of a beautiful and convenient program for tagging files, and I decided that I could no longer live this way.
The problem of hierarchical file systems
Users often face the issue of choosing a storage location for each new file and the problem of finding their own files (sometimes file names are not intended to be memorable for humans at all).
A solution to this situation can be semantic file systems, which are usually a layer above the traditional file system. In these, directories are replaced by semantic attributes, also known as tags, categories, or metadata. I will more often use the term 'category', as the word 'tag' can seem odd in the context of file systems, especially when 'sub-tags' and 'tag aliases' come into play.
Assigning categories to files largely alleviates the storage and searching problems: if you remember (or suspect) at least one of the assigned categories for a file, it will never be out of sight.
This topic has been raised multiple times on Habr earlier (, , , and others), here I describe my solution.
Path to implementation
Immediately after the mentioned dream, I described in a notebook a command interface that provides the necessary work with categories. At that time, I thought that within a week or two, I could write a prototype using Python or Bash, and then work on creating a graphical interface using Qt or GTK would follow. Reality, as always, turned out to be much harsher, and development took longer.
The initial idea was to create a program with a user-friendly and concise command-line interface that would create and delete categories, assign categories to files, and remove categories from files. I named the program vitis.
The first attempt to create vitis det slutade utan resultat, eftersom mycket tid började gÄ Ät till arbete och institutet. Det andra försöket resulterade i nÄgot: jag lyckades avsluta det planerade projektet för min magisteravhandling och till och med göra en prototyp av GTK-grÀnssnittet. Men den versionen visade sig vara sÄ opÄlitlig och ohandlig att jag var tvungen att tÀnka om mycket.
I den tredje versionen anvĂ€nde jag det faktiskt sjĂ€lv under en lĂ„ng tid, dĂ€r jag flyttade flera tusen av mina filer till kategorier. Detta pĂ„verkades starkt av den implementerade autocompletion i bash. Men vissa problem, sĂ„som avsaknaden av automatiska kategorier och möjligheten att lagra filer med samma namn, kvarstod, och programmet började knaka under sin egen komplexitet. SĂ„ jag insĂ„g behovet av att lösa problemen med utveckling av komplex mjukvara: skriva detaljerade krav, utveckla ett system för funktionell testning, studera instruktioner för paketering och mycket mer. Nu har jag nĂ„tt dit jag tĂ€nkt mig, sĂ„ detta blygsamma verk kan nu presenteras för det öppna samfundet. SĂ„dan specifik filhantering, som hantering genom kategorikonceptet, vĂ€cker ovĂ€ntade frĂ„gor och problem, och i lösningen av dem. vitis skapade omkring sig ytterligare fem projekt, nĂ„gra av dem kommer att nĂ€mnas i artikeln. Ăn idag vitis har jag inte fĂ„tt nĂ„gon grafisk grĂ€nssnitt, men anvĂ€ndarvĂ€nligheten med filkategorier frĂ„n kommandoraden överskytter redan för mig alla fördelar med en vanlig grafisk filhanterare.
Exempel pÄ anvÀndning
LÄt oss börja enkelt - skapa en kategori:
vitis create MusikLÄt oss lÀgga till en komposition som exempel:
vitis assign Musik -f "The Ink Spots - I Don't Want To Set The World On Fire.mp3"InnehÄllet i kategorin "Musik" kan ses med delkommandot "show":
vitis show MusikDen kan spelas upp med delkommandot "open"
vitis open MusikEftersom vi har bara en fil i kategorin "Musik", sÄ kommer endast den att startas. För att öppna filer med standardprogram gjorde jag ett separat verktyg vts-fs-open (standardverktyg som xdg-open eller mimeopen passade mig inte av flera skÀl; men om sÄ Àr fallet, kan du i instÀllningarna ange ett annat verktyg för universell filöppning). Detta verktyg fungerar bra pÄ olika distributioner med olika skrivbordsmiljöer, sÄ jag rekommenderar att installera det tillsammans med vitis.
Man kan ocksÄ ange programmet för att öppna filer direkt:
vitis open Musik --app qmmp
LĂ„t oss skapa fler kategorier och lĂ€gga till filer med hjĂ€lp av «assign». Om filer tilldelas kategorier som Ă€nnu inte existerar, kommer en begĂ€ran om deras skapande att ges. Man kan undvika onödiga förfrĂ„gningar genom att anvĂ€nda flaggan âyes.
vitis assign Programmering R -f "Introduktion till R.pdf" "Statistiskt paket R: sannolikhetsteori och matstatistik.pdf" --yesNu vill vi lÀgga till filen «Statistiskt paket R: sannolikhetsteori och matstatistik.pdf» i kategorin «Matematik». Vi vet att denna fil redan har kategorin «R» och kan dÀrför anvÀnda kategorivÀgen frÄn Vitis-systemet:
vitis assign Matematik -v "R/Statistiskt paket R: sannolikhetsteori och matstatistik.pdf"Tack och lov kommer bash-autocomplete att göra detta enkelt.
LĂ„t oss se vad vi har Ă„stadkommit, med flaggan âcategories för att se listan över kategorier för varje fil:
vitis show R --categories
Observera att filerna ocksÄ fick automatiskt tilldelade kategorier baserat pÄ format, typ (som sammanför format) och filÀndelse. Dessa kategorier kan stÀngas av om sÄ önskas. Jag kommer definitivt att lokalisera deras namn senare.
Vi lÀgger till nÄgot mer för variation i «Matematik»:
vitis assign Matematik -f "Matematisk analys - 1984.pdf" Perelman_UnderhÄllande_mathematik_1927.djvu Nu börjar det bli intressant. IstÀllet för kategorier kan man skriva uttryck med operationer för union, snitt och differens, det vill sÀga anvÀnda operationer över mÀngder. Till exempel, snittet mellan «Matematik» och «R» ger resultatet en fil.
vitis show R i: MatematikVi subtraherar nÀmner av sprÄket «R» frÄn «Matematik»:
vitis show Matematik R #eller vitis show Matematik c: RVi kan meningslöst förena musik och sprÄk R:
vitis show Musik u: RFlaggan -n gör att man kan "dra ut" de önskade filerna frÄn resultaten efter nummer och/eller intervaller, till exempel, -n 3-7, eller lite mer komplicerat: -n 1,5,8-10,13. Det Àr ofta anvÀndbart med delkommandot open, vilket tillÄter att öppna önskade filer frÄn listan.

Ăven om vi avviker frĂ„n att anvĂ€nda den vanliga kataloghierarkin, Ă€r det ofta anvĂ€ndbart att ha underkategorier. LĂ„t oss skapa en underkategori «Statistik» i kategorin «Matematik» och lĂ€gga till denna kategori till en relevant fil:
vitis create Matematik/Statistik
vitis assign Matematik/Statistik -v "R/Introduktion till R.pdf"
vitis show Matematik --categories
Vi kan se att denna fil nu har kategorin «Matematik/Statistik» istÀllet för «Matematik» (överflödiga lÀnkar spÄras).
Att referera till den fullstÀndiga vÀgen kan vara besvÀrligt, lÄt oss skapa en «global» alias:
vitis assign Matematik/Statistik -a Statistik
vitis show Statistik
Inte bara vanliga filer
InternetlÀnkar
För att standardisera lagringen av information skulle det vara bra att, Ätminstone, kategorisera lÀnkar till webbresurser. Och det Àr möjligt:
vitis assign Habr FÀrganomali -i https://habr.com/ru/company/sfe_ru/blog/437304/ --yesEn fil kommer att skapas pÄ en speciell plats med titeln av HTML-sidan och med tillÀgget .desktop. Det Àr det traditionella formatet för genvÀgar i GNU/Linux. SÄdana genvÀgar fÄr automatiskt kategorin NetworkBookmarks.
Naturligtvis skapas genvÀgar för att anvÀndas:
vitis open FÀrganomaliAtt utföra kommandot öppnar den just sparade lÀnken i webblÀsaren. Kategoriserade genvÀgar till webbresurser kan fungera som en ersÀttning för webblÀsarbokmÀrken.
Filfragment
Det Ă€r ocksĂ„ bra att ha kategorier för individuella filfragment. Inte dĂ„lig idĂ©, va? Men den nuvarande implementeringen berör för tillfĂ€llet endast vanliga textfiler, ljud- och videofiler. LĂ„t oss sĂ€ga att du mĂ„ste markera ett visst stycke av en konsert eller en rolig stund i en film, dĂ„ kan du anvĂ€nda flaggorna âfragname, âstart, âfinish med assign. LĂ„t oss spara introt frĂ„n «Duck Tales»:
vitis assign vitis assign -c Intros -f Duck_Tales/s01s01.avi --finish 00:00:59 --fragname "Duck Tales intro"
vitis open IntrosDet sker faktiskt ingen avskĂ€rning av filer, istĂ€llet skapas en pekare till ett fragment, dĂ€r filens typ, sökvĂ€g, början och slut pĂ„ fragmentet beskrivs. Skapandet och öppnandet av pekare till fragment överlĂ„tits till verktyg som jag speciellt har gjort för dessa syften â det Ă€r mediafragmenter och fragplayer. Den förra skapar, den senare öppnar. I fallet med ljud- och videoinspelningar sker start av mediainnehĂ„llet frĂ„n en viss position till en annan med hjĂ€lp av VLC-spelaren, sĂ„ den mĂ„ste ocksĂ„ finnas i systemet. Jag tĂ€nkte först göra detta baserat pĂ„ mplayer, men dĂ€r fungerade positionshanteringen av nĂ„gon anledning mycket dĂ„ligt.
I vĂ„rt exempel skapas filen "Duck Tales intro.fragpointer" (den placeras pĂ„ en sĂ€rskild plats), och sedan spelas ett avsnitt frĂ„n början av filen (eftersom âstart inte angavs vid skapandet) till mĂ€rkningen vid 59 sekunder, varefter VLC stĂ€ngs.
Ett annat exempel Àr att vi önskar kategorisera en specifik upptrÀdande pÄ en konsert med en kÀnd artist:
vitis assign ĐĐ”ĐżŃ "ХпаŃĐžŃĐ” ĐœĐ°ŃĐž ĐŽŃŃĐž" -f ĐŃĐžĐłĐŸŃĐžĐč ĐДпc - ĐĐŸĐœŃĐ”ŃŃ ĐаŃŃŃ - пДŃĐœĐž ĐĐ»Đ°ĐŽĐžĐŒĐžŃа ĐŃŃĐŸŃĐșĐŸĐłĐŸ.mp4 --fragname "ХпаŃĐžŃĐ” ĐœĐ°ŃĐž ĐŽŃŃĐž" --start 00:32:18 --finish 00:36:51
vitis open "ХпаŃĐžŃĐ” ĐœĐ°ŃĐž ĐŽŃŃĐž"Vid öppnandet kommer filen att spelas frĂ„n den angivna positionen och stĂ€ngas efter fyra och en halv minut.
Hur det hela fungerar + ytterligare möjligheter
Lagring av kategorier
NÀr jag först tÀnkte pÄ hur jag skulle organisera det semantiska filsystemet kom jag pÄ tre sÀtt: genom att lagra symboliska lÀnkar, via en databas, genom en beskrivning i XML. Den första metoden segrade eftersom den, Ä ena sidan, Àr enkel att implementera, och Ä andra sidan - ger anvÀndaren möjlighet att se kategorierna direkt frÄn filsystemet (och det Àr praktiskt och viktigt). NÀr jag började anvÀnda vitis i anvÀndarens hemkatalog skapas en mapp med namnet "Vitis" och en konfigurationsfil " .config/vitis/vitis.conf". I ~ /Vitis skapas mappar som motsvarar kategorierna, och i dessa kategorimappar skapas symboliska lÀnkar till de ursprungliga filerna. Kategorins alias Àr ocksÄ bara lÀnkar till dem. Naturligtvis kan existensen av mappen "Vitis" i hemkatalogen vara oönskad för vissa. Vi kan byta till en annan plats:
vitis service set path /mnt/MyFavoriteDisk/Vitis/Vid en viss tidpunkt blir det tydligt att filer som Àr spridda pÄ olika platser Àr meningslösa att kategorisera, eftersom deras placering kan Àndras. DÀrför skapade jag först en mapp dÀr jag enkelt samlade allt och gav det alla kategorier. Jag tyckte senare att det skulle vara bra att ordna detta pÄ programnivÄ. SÄ kom begreppet "filutrymme" till. vitis Det skulle omedelbart vara bra att stÀlla in ett sÄdant utrymme (dÀr alla nödvÀndiga filer kommer att lagras) och aktivera automatisk lagring:
vitis service add filespace /mnt/MyFavoriteDisk/Filespace/
vitis service set autosave yesUtan automatisk sparande vid anvĂ€ndning av underkommandot «assign» kommer flaggan âsave att krĂ€vas om man vill spara den tillagda filen i filsystemet.
Dessutom kan man lÀgga till flera filsystem och Àndra deras prioriteringar, vilket kan vara anvÀndbart nÀr det finns mÄnga filer och de lagras pÄ olika enheter. HÀr kommer jag inte att gÄ in pÄ detta, detaljer kan lÀsas i programmets hjÀlp.
Migrering av semantiskt filsystem
SÄ eller sÄ kan katalogen Vitis och filsystemen teoretiskt flyttas emellanÄt. För att ÄtgÀrda detta har jag skapat ett separat verktyg link-editor, som kan redigera lÀnkar massivt genom att byta ut delar av sökvÀgen mot andra:
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örsta fallet, efter att vi flyttat frÄn /mnt/MyFavoriteDisk/Vitis/ till hemkatalogen, redigeras de symboliska lÀnkarna relaterade till alias. I det andra fallet, efter att ha förÀndrat platsen för filsystemet, Àndras alla lÀnkar i Vitis till nya enligt förfrÄgan om att byta del av deras sökvÀg.
Automatiska kategorier
Om man kör kommandot vitis service get autocategorization, kan man se att automatisk kategorisering som standard Àr instÀlld enligt format (Format och Typ) och filÀndelse (Extension).
Detta Àr anvÀndbart nÀr man till exempel behöver hitta nÄgot bland PDF-filer eller se vad man har lagrat av EPUB och FB2, man kan helt enkelt köra kommandot
vitis show Format/MOBI u: Format/FB2Det visade sig att standardverktyg i GNU/Linux som file eller mimetype inte tillfredsstĂ€llde mina behov just för att de inte alltid korrekt identifierar format. Jag var tvungen att göra min egen implementation baserad pĂ„ filsignaturer och filĂ€ndelser. Ăverhuvudtaget Ă€r Ă€mnet för att bestĂ€mma filformat ett intressant forskningsomrĂ„de och förtjĂ€nar en separat artikel. Jag kan Ă€n sĂ„ lĂ€nge sĂ€ga att jag kanske inte har förutsett korrekt identifiering för alla format i vĂ€rlden, men generellt fungerar det redan ganska bra. Sant Ă€r att EPUB just nu identifieras som ZIP (vilket i stort sett Ă€r berĂ€ttigat, men i praktiken bör det inte betraktas som normalt beteende). Tills vidare kan ni betrakta denna funktion som experimentell, och rapportera eventuella buggar. I mĂ€rkliga situationer kan man alltid anvĂ€nda kategorier baserade pĂ„ filĂ€ndelser, till exempel Extension/epub.
Om automatiska kategorier baserade pÄ format Àr aktiverade, Àr Àven automatiska kategorier aktiverade som förenar vissa format under rubriker som: «Arkiv», «Bilder», «Video», «Ljud» och «Dokument». Lokala namn kommer ocksÄ att skapas för dessa underkategorier.
Om vad som inte nÀmns
vitis blev en mycket mÄngfacetterad verktyg och det Àr svÄrt att tÀcka allt pÄ en gÄng. Kort ska jag nÀmna vad mer som kan göras:
- kategorier kan tas bort och avlÀgsnas frÄn filer;
- resultaten av sökningar pÄ uttryck kan kopieras till den angivna katalogen;
- filer kan köras som program;
- kommandot show har mÄnga alternativ, till exempel sortering efter namn/datum för Àndring eller Ätkomst/storlek/Àndelse, visning av filers egenskaper och vÀgar till original, inklusive visning av dolda filer m.m.;
- vid sparande av lÀnkar till internetkÀllor kan Àven lokala kopior av HTML-sidor sparas.
Alla detaljer kan hittas i anvÀndarhandledningen.
Framtidsutsikter
Skeptiker sÀger ofta att «ingen kommer att ordna dessa taggar sjÀlv». Jag kan bevisa motsatsen genom mitt exempel: jag har redan kategoriserat över sex tusen filer, skapat över tusen kategorier och alias, och det var vÀrt det. NÀr du med ett kommando vitis open Plan öppnar din att-göra-lista eller nÀr du med ett kommando vitis open LaTeX öppnar Stoljarovs bok om LaTeX-systemet, sÄ blir det redan mentalt svÄrt att anvÀnda filsystemet «pÄ det gamla sÀttet».
PÄ denna grund uppstÄr en rad idéer. Till exempel kan man skapa en automatisk radio som spelar tematisk musik beroende pÄ aktuellt vÀder, helgdag, veckodag, tid pÄ dygnet eller Ärstid. NÀra relaterat Àr en musikspelare som kÀnner till kategorier och kan spela musik baserat pÄ uttryck med operationer mellan kategorier som om de var mÀngder. Det skulle vara anvÀndbart att göra en demon som övervakar mappen "Nedladdningar" och föreslÄr att kategorisera nya filer. Och sjÀlvklart borde man skapa en ordentlig grafisk semantisk filhanterare. Jag gjorde en webbtjÀnst för företaget för gemensam filanvÀndning en gÄng, men den blev inte prioriterad och blev irrelevant, Àven om den nÄdde en hög nivÄ av funktionalitet. (I samband med stora förÀndringar i sjÀlva vitis, Àr den redan oanvÀndbar.)
HÀr Àr en liten demonstration

Slutsats
Vitis â inte det första försöket att radikalt förĂ€ndra arbetsstilen med data, men jag tyckte det var viktigt att realisera mina idĂ©er och publicera implementationen som öppen kĂ€llkod under licensen GNU GPL. För bekvĂ€mlighet har jag gjort ett deb-paket för x86-64, det bör fungera pĂ„ alla moderna Debian-distributioner. För ARM uppstod det smĂ„ problem (Ă€ven om alla andra program som relaterar till vitis, fungerar bra), men senare kommer det Ă€ndĂ„ att skapas ett fungerande paket för denna plattform (armhf). Jag har för tillfĂ€llet slutat med skapandet av RPM-paket pĂ„ grund av problem med Fedora 30 och problematiken i att sprida sig över mĂ„nga RPM-distributioner, men senare kommer det Ă€ndĂ„ att göras paket för Ă„tminstone ett par av dem. Tills dess kan man anvĂ€nda make && make install eller checkinstall.
Tack för uppmÀrksamheten! Jag hoppas att denna artikel och detta projekt kan visa sig vara anvÀndbara.
KĂ€lla: habr.com
