Categorie invece di directory o file system semantico per Linux

La stessa classificazione dei dati è un argomento di ricerca interessante. Adoro raccogliere le informazioni che sembrano necessarie e ho sempre cercato di creare gerarchie logiche di directory per i miei file, e un giorno in sogno ho visto un bellissimo e comodo programma per assegnare tag ai file e ho deciso che non potevo vivere così più.

Il problema dei file system gerarchici

Gli utenti si trovano spesso ad affrontare il problema di scegliere dove salvare il nuovo file successivo e il problema di trovare i propri file (a volte i nomi dei file non sono affatto destinati a essere ricordati da una persona).

Una via d'uscita da questa situazione potrebbe essere rappresentata dai file system semantici, che di solito sono un componente aggiuntivo del file system tradizionale. Le directory al loro interno sono sostituite da attributi semantici, chiamati anche tag, categorie e metadati. Utilizzerò più spesso il termine “categoria”, perché... Nel contesto dei file system, la parola "tag" a volte è un po' strana, soprattutto quando compaiono "sottotag" e "tag alias".

L'assegnazione di categorie ai file elimina in gran parte il problema della memorizzazione e della ricerca di un file: se ricordi (o indovini) almeno una delle categorie assegnate a un file, il file non scomparirà mai dalla vista.

In precedenza, questo argomento era stato sollevato più di una volta su Habré (tempo, два, tre, четыре ecc.), qui descrivo la mia soluzione.

Percorso verso la realizzazione

Subito dopo il sogno menzionato, ho descritto nel mio taccuino l'interfaccia di comando che fornisce il lavoro necessario con le categorie. Poi ho deciso che in una o due settimane avrei potuto scrivere un prototipo usando Python o Bash, e poi avrei dovuto lavorare sulla creazione di una shell grafica in Qt o GTK. La realtà, come sempre, si è rivelata molto più dura e lo sviluppo è stato ritardato.

L'idea originale era quella di creare prima di tutto un programma con un'interfaccia a riga di comando comoda e concisa che creasse, eliminasse categorie, assegnasse categorie ai file ed eliminasse categorie dai file. Ho chiamato il programma Sussurro.

Primo tentativo di creazione Sussurro finì nel nulla, poiché molto tempo cominciò a essere dedicato al lavoro e all'università. Il secondo tentativo è già stato qualcosa: per la tesi magistrale sono riuscito a completare il progetto previsto e persino a realizzare un prototipo della shell GTK. Ma quella versione si è rivelata così inaffidabile e scomoda che è stato necessario ripensare molto.

In realtà io stesso ho utilizzato la terza versione per molto tempo, avendo trasferito diverse migliaia dei miei file in categorie. Ciò è stato anche notevolmente facilitato dal completamento di bash implementato. Ma rimanevano ancora alcuni problemi, come la mancanza di categorie automatiche e la possibilità di memorizzare file con lo stesso nome, e il programma era già piegato dalla sua stessa complessità. È così che sono arrivato alla necessità di risolvere problemi complessi di sviluppo software: scrivere requisiti dettagliati, sviluppare un sistema di test funzionale, studiare istruzioni di confezionamento e molto altro. Sono ormai arrivato al mio progetto, affinché questa umile creazione possa essere presentata alla libera comunità. La gestione specifica dei file, come la gestione attraverso il concetto di categorie, solleva questioni e problemi imprevisti e nella loro risoluzione Sussurro ha generato altri cinque progetti attorno a sé, alcuni dei quali saranno menzionati nell'articolo. Finora Sussurro Non ho acquistato una shell grafica, ma la comodità di utilizzare le categorie di file dalla riga di comando supera già per me qualsiasi vantaggio di un normale file manager grafico.

Esempi di utilizzo

Iniziamo in modo semplice: crea una categoria:

vitis create Музыка

Aggiungiamo qualche composizione come esempio:

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

Puoi visualizzare il contenuto della categoria “Musica” utilizzando il sottocomando “mostra”:

vitis show Музыка

Puoi riprodurlo usando il sottocomando "open".

vitis open Музыка

Perché Se abbiamo un solo file nella categoria "Musica", verrà avviato solo quello. Allo scopo di aprire i file con i loro programmi predefiniti, ho creato un'utilità separata vts-fs-open (strumenti standard come xdg-open o mimeopen non mi andavano per una serie di motivi; ma, semmai, nelle impostazioni puoi specificare un'altra utilità per l'apertura universale dei file). Questa utility funziona bene su diverse distribuzioni con diversi ambienti di lavoro, quindi consiglio di installarla insieme a vitis.

Puoi anche specificare direttamente il programma per aprire i file:

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

Categorie invece di directory o file system semantico per Linux

Creiamo più categorie e aggiungiamo file utilizzando "assegna". Se i file vengono assegnati a categorie che non esistono ancora, verrà richiesto di crearli. Una richiesta non necessaria può essere evitata utilizzando il flag -yes.

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

Ora vogliamo aggiungere la categoria “Matematica” al file “Pacchetto statistico R: teoria della probabilità e statistica matematica.pdf”. Sappiamo che questo file è già classificato come "R" e quindi possiamo utilizzare il percorso della categoria dal sistema Vitis:

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

Fortunatamente, il completamento di bash rende tutto più semplice.

Vediamo cosa è successo, utilizzando il flag --categories per vedere un elenco di categorie per ciascun file:

vitis show R --categories

Categorie invece di directory o file system semantico per Linux

Tieni presente che i file sono stati anche classificati automaticamente in base al formato, al tipo (combina i formati) e all'estensione del file. Se lo si desidera, queste categorie possono essere disabilitate. Più tardi localizzerò sicuramente i loro nomi.

Aggiungiamo qualcos'altro a "Matematica" per varietà:

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

E ora le cose si fanno interessanti. Invece delle categorie, puoi scrivere espressioni con le operazioni di unione, intersezione e sottrazione, ovvero utilizzare operazioni sugli insiemi. Ad esempio, l'intersezione di "Math" con "R" risulterà in un file.

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

Sottraiamo i riferimenti alla lingua “R” da “Matematica”:

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

Possiamo combinare senza meta la musica e il linguaggio R:

vitis show Музыка u: R

Il flag -n consente di "estrarre" i file richiesti dal risultato della richiesta in base a numeri e/o intervalli, ad esempio, -n 3-7o qualcosa di più complicato: -n 1,5,8-10,13. Spesso è utile con il sottocomando open, che consente di aprire i file desiderati da un elenco.

Categorie invece di directory o file system semantico per Linux

Anche se ci stiamo allontanando dall'utilizzo di una gerarchia di directory convenzionale, è spesso utile avere categorie nidificate. Creiamo una sottocategoria "Statistiche" sotto la categoria "Matematica" e aggiungiamo questa categoria al file appropriato:

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

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

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

Categorie invece di directory o file system semantico per Linux

Possiamo vedere che questo file ora ha la categoria "Matematica/Statistica" invece di "Matematica" (vengono tracciati i collegamenti extra).

Affrontare il percorso completo può essere scomodo, creiamo un alias “globale”:

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

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

Categorie invece di directory o file system semantico per Linux

Non solo file normali

Collegamenti Internet

Per unificare l'archiviazione di qualsiasi informazione, sarebbe utile, come minimo, classificare i collegamenti alle risorse Internet. E questo è possibile:

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

In un posto speciale verrà creato un file con l'intestazione della pagina HTML e l'estensione .desktop. Questo è il formato di scelta rapida tradizionale in GNU/Linux. Tali scorciatoie vengono automaticamente classificate come NetworkBookmarks.

Naturalmente vengono create delle scorciatoie da utilizzare:

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

L'esecuzione del comando provoca l'apertura nel browser del collegamento appena salvato. I collegamenti categorizzati alle fonti Internet possono sostituire i segnalibri del browser.

Frammenti di file

È anche utile avere categorie per singoli pezzi di file. Non è una cattiva richiesta, eh? Ma l'attuale implementazione finora riguarda solo file di testo semplice, file audio e video. Diciamo che devi contrassegnare una certa parte di un concerto o un momento divertente in un film, quindi quando usi assegna puoi usare i flag -fragname, -start, -finish. Salviamo lo screensaver da "DuckTales":

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

vitis open Заставки

In realtà non avviene alcun taglio del file, ma viene creato un file puntatore al frammento che descrive il tipo di file, il percorso del file, l'inizio e la fine del frammento. La creazione e l'apertura dei puntatori ai frammenti è delegata alle utilità che ho creato appositamente per questi scopi: mediafragmenter e fragplayer. Il primo crea, il secondo apre. Nel caso delle registrazioni audio e video, il file multimediale viene lanciato da una determinata posizione a una determinata tramite il lettore VLC, quindi deve essere anche nel sistema. All'inizio volevo farlo basandomi su mplayer, ma per qualche motivo era molto disordinato nel posizionamento al momento giusto.
Nel nostro esempio, viene creato il file "Duck Tales intro.fragpointer" (è posizionato in un posto speciale), quindi viene riprodotto un frammento dall'inizio del file (poiché –start non è stato specificato durante la creazione) fino al 59 seconda tacca, dopo la quale VLC si chiude.

Un altro esempio è quando abbiamo deciso di classificare una singola esibizione in un concerto di un artista famoso:

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

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

Una volta aperto, il file verrà incluso nella posizione desiderata e si chiuderà dopo quattro minuti e mezzo.

Come funziona + funzionalità aggiuntive

Memorizzazione delle categorie

Quando ho iniziato a pensare all'organizzazione di un file system semantico, mi sono venuti in mente tre modi: attraverso la memorizzazione di collegamenti simbolici, attraverso un database, attraverso una descrizione in XML. Il primo metodo ha vinto, perché... da un lato è facile da implementare e, dall'altro, l'utente ha la possibilità di guardare le categorie direttamente dal file system (e questo è comodo e importante). All'inizio dell'uso Sussurro La directory “Vitis” e il file di configurazione “.config/vitis/vitis.conf” vengono creati nella directory home dell’utente. Le directory corrispondenti alle categorie vengono create in ~/Vitis e in queste directory di categorie vengono creati collegamenti simbolici ai file originali. Anche gli alias di categoria sono solo collegamenti ad esse. Naturalmente, la presenza della directory “Vitis” nella directory home potrebbe non essere adatta ad alcune persone. Possiamo passare a qualsiasi altra posizione:

vitis service set path /mnt/MyFavoriteDisk/Vitis/

Ad un certo punto diventa chiaro che non ha molto senso classificare file sparsi in luoghi diversi, poiché la loro posizione può cambiare. Pertanto, per cominciare, ho creato una directory per me, dove ho stupidamente scaricato tutto e gli ho dato tutte le categorie. Poi ho deciso che sarebbe stato bello ufficializzare questo momento a livello di programma. È così che è apparso il concetto di "spazio file". All'inizio dell'uso Sussurro Non sarebbe male impostare immediatamente una posizione di questo tipo (tutti i file di cui abbiamo bisogno verranno archiviati lì) e abilitare il salvataggio automatico:

vitis service add filespace /mnt/MyFavoriteDisk/Filespace/

vitis service set autosave yes

Senza il salvataggio automatico, quando si utilizza il sottocomando "assign", sarà richiesto il flag --save se si desidera salvare il file aggiunto nello spazio file.

Inoltre, è possibile aggiungere diversi spazi file e modificarne le priorità; questo può essere utile quando ci sono molti file e sono archiviati su supporti diversi. Non prenderò in considerazione questa possibilità in questa sede; i dettagli possono essere trovati nella guida del programma.

Migrazione del file system semantico

Ad ogni modo, la directory Vitis e gli spazi file possono teoricamente a volte spostarsi da un posto all'altro. Per farlo funzionare, ho creato un'utilità separata editor di link, che può modificare in blocco i collegamenti, sostituendo parti del percorso con altre:

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

Nel primo caso, dopo esserci spostati da /mnt/MyFavoriteDisk/Vitis/ alla directory home, vengono modificati i collegamenti simbolici associati agli alias. Nel secondo caso, dopo aver modificato la posizione dello spazio file, tutti i collegamenti in Vitis vengono modificati con nuovi in ​​conformità con la richiesta di sostituire parte del loro percorso.

Categorie automatiche

Se esegui il comando vitis service get autocategorization, puoi vedere che per impostazione predefinita, le categorie automatiche vengono assegnate in base al formato (Formato e Tipo) e all'estensione del file (Estensione).

Questo è utile quando, ad esempio, devi cercare qualcosa tra i PDF o guardare cosa hai memorizzato da EPUB e FB2, puoi semplicemente eseguire la richiesta

vitis show Format/MOBI u: Format/FB2

È capitato che gli strumenti standard GNU/Linux come file o MIMEType non fossero adatti a me proprio perché non sempre determinano correttamente il formato; ho dovuto creare la mia implementazione basata sulle firme e sulle estensioni dei file. In generale, il tema della definizione dei formati dei file è un argomento interessante per la ricerca e merita un articolo a parte. Per ora posso dire che forse non ho dato un vero riconoscimento a tutti i formati del mondo, ma in generale sta già funzionando bene. È vero, EPUB ora definisce il formato come ZIP (in generale questo è giustificato, ma in pratica non dovrebbe essere considerato un comportamento normale). Per il momento considera questa funzionalità sperimentale e segnala eventuali bug. In situazioni strane, puoi sempre utilizzare le categorie di estensioni di file, ad esempio Extension/epub.

Se sono abilitate le autocategorie per formato, sono abilitate anche le autocategorie che raggruppano alcuni formati per tipologia: “Archivi”, “Immagini”, “Video”, “Audio” e “Documenti”. Verranno creati nomi localizzati anche per queste sottocategorie.

Ciò che non è detto

Sussurro Si è rivelato uno strumento molto sfaccettato ed è difficile coprire tutto in una volta. Vorrei menzionare brevemente cos'altro puoi fare:

  • le categorie possono essere cancellate e rimosse dai file;
  • i risultati delle query di espressione possono essere copiati nella directory specificata;
  • i file possono essere eseguiti come programmi;
  • Il comando show ha molte opzioni, ad esempio, ordina per nome/data di modifica o accesso/dimensione/estensione, mostra le proprietà dei file e i percorsi degli originali, abilita la visualizzazione di file nascosti, ecc.;
  • Quando salvi i collegamenti a fonti Internet, puoi anche salvare copie locali delle pagine HTML.

I dettagli completi sono disponibili nella guida per l'utente.

prospettive

Gli scettici spesso dicono che “nessuno imposterà questi tag da solo”. Usando il mio esempio, posso dimostrare il contrario: ho già classificato più di seimila file, creato più di mille categorie e alias e ne è valsa la pena. Quando una squadra vitis open План apri l'elenco delle cose da fare o quando con un comando vitis open LaTeX Quando si apre il libro di Stolyarov sul sistema di layout LaTeX, è già moralmente difficile usare il file system “alla vecchia maniera”.

Su questa base nascono una serie di idee. Ad esempio, puoi creare una radio automatica che attivi musica tematica in base al tempo attuale, alle festività, al giorno della settimana, all'ora del giorno o all'anno. Ancora più vicino all'argomento è un lettore musicale che conosce le categorie e può riprodurre musica per espressione con operazioni sulle categorie come sui set. È utile creare un demone che monitorerà la directory "Download" e offrirà di classificare i nuovi file. E, naturalmente, dovremmo creare un normale file manager semantico grafico. Una volta ho anche creato un servizio web aziendale per l'uso collettivo dei file, ma non era una priorità ed è diventato irrilevante, pur raggiungendo un alto livello di prestazioni. (A causa di importanti cambiamenti nel Sussurro, non è più utilizzabile.)

ecco una piccola demo

Categorie invece di directory o file system semantico per Linux

conclusione

Vitis non è il primo tentativo di cambiare radicalmente lo stile di lavoro con i dati, ma ho ritenuto importante implementare le mie idee e rendere l'implementazione disponibile pubblicamente sotto la licenza GNU GPL. Per comodità, è stato creato un pacchetto deb per x86-64; dovrebbe funzionare su tutte le moderne distribuzioni Debian. Ci sono state piccole difficoltà su ARM (mentre tutti gli altri programmi relativi a Sussurro, funzionano bene), ma in futuro verrà compilato un pacchetto funzionante per questa piattaforma (armhf). Per ora ho smesso di creare pacchetti RPM a causa di problemi su Fedora 30 e della difficoltà di diffondersi in molte distribuzioni RPM, ma in seguito verranno comunque realizzati pacchetti per almeno un paio di esse. Nel frattempo puoi usare make && make install o checkinstall.

Grazie a tutti per l'attenzione! Spero che questo articolo e questo progetto possano essere utili.

Collegamento al repository del progetto

Fonte: habr.com

Aggiungi un commento