La classification des données est en soi un sujet de recherche intéressant. J'aime collecter les informations qui semblent nécessaires, et j'ai toujours essayé de faire des hiérarchies logiques de répertoires pour mes fichiers, et une fois dans un rêve, j'ai vu un programme beau et pratique pour attribuer des balises aux fichiers, et j'ai décidé qu'il était impossible de vivre comme ça.
Le problème des systèmes de fichiers hiérarchiques
Les utilisateurs rencontrent souvent le problème de choisir l'emplacement pour enregistrer le nouveau nouveau fichier et le problème de trouver leurs propres fichiers (parfois les noms de fichier ne sont pas du tout destinés à un stockage humain).
Le moyen de sortir de cette situation peut être des systèmes de fichiers sémantiques, qui sont généralement un complément à un système de fichiers traditionnel. Les répertoires qu'ils contiennent sont remplacés par des attributs sémantiques, également appelés balises, catégories, métadonnées. J'utiliserai le terme «catégorie» plus souvent, car dans le contexte des systèmes de fichiers, le mot «tag» est parfois bizarre, surtout lorsque «sous-tags» et «alias de tag» apparaissent.
L'attribution de catégories aux fichiers élimine largement les problèmes de stockage et de recherche de fichiers: si vous vous souvenez (ou devinez) au moins une des catégories affectées au fichier, le fichier ne sera jamais perdu de vue.
Plus tôt dans Habré, ce sujet a été soulevé plus d'une fois ( un , deux , trois , quatre , etc.), ici je décris ma décision.
Chemin de mise en œuvre
Immédiatement après le rêve susmentionné, j'ai décrit dans un cahier l'interface de commande qui fournit le travail nécessaire avec les catégories. Ensuite, j'ai décidé qu'en une semaine ou deux, vous pouvez écrire un prototype en utilisant Python ou Bash, puis vous devrez travailler sur la création d'un shell graphique sur Qt ou GTK. La réalité, comme toujours, s'est avérée beaucoup plus grave et le développement a traîné en longueur.
L'idée initiale était de créer d'abord un programme avec une interface de ligne de commande pratique et concise qui créerait, supprimerait des catégories, assignerait des catégories aux fichiers et supprimerait des catégories des fichiers. J'ai appelé le programme vitis .
La première tentative de création de vitis n'a abouti à rien, car beaucoup de temps a été consacré au travail et à l'université. La deuxième tentative était déjà quelque chose: grâce à la thèse de maîtrise, nous avons réussi à terminer le projet prévu et même à faire un prototype de la coque GTK. Mais cette version s'est avérée si peu fiable et inconfortable que j'ai dû beaucoup repenser.
J'ai déjà vraiment utilisé la troisième version depuis très longtemps, traduisant plusieurs milliers de mes fichiers en catégories. Ceci, entre autres choses, a été grandement facilité par l'autocomplétion bash implémentée. Mais certains problèmes, tels que le manque de catégories automatiques et la possibilité de stocker des fichiers du même nom, restaient, et le programme était déjà plié sous sa propre complexité. Je suis donc venu à la nécessité de résoudre les problèmes de développement de logiciels complexes: écrire des exigences détaillées, développer un système de test fonctionnel, étudier les instructions d'emballage et bien plus encore. Maintenant que je suis arrivé à un plan, cette modeste création peut être présentée à la communauté libre. Une telle gestion de fichiers spécifiques, comme la gestion à travers le concept de catégories, touche à des questions et des problèmes inattendus, et en les résolvant, vitis a généré cinq autres projets autour de lui, dont certains seront mentionnés dans l'article. Jusqu'à présent, vitis n'a pas acquis de shell graphique, mais la commodité d'utiliser les catégories de fichiers à partir de la ligne de commande couvre déjà pour moi tous les avantages du gestionnaire de fichiers graphiques habituel.
Exemples d'utilisation
Commençons par une simple - créer une catégorie:
vitis create
Ajoutons-y une composition à titre d'exemple:
vitis assign -f "The Ink Spots - I Don't Want To Set The World On Fire.mp3"
Vous pouvez afficher le contenu de la catégorie Musique par la commande show:
vitis show
Vous pouvez y jouer en utilisant la sous-commande "open"
vitis open
Parce que nous n'avons qu'un seul fichier dans la catégorie "Musique", alors seulement il démarrera. Dans le but d'ouvrir des fichiers avec leurs programmes, par défaut, j'ai créé un utilitaire distinct vts-fs-open (les outils standard comme xdg-open ou mimeopen ne me convenaient pas pour un certain nombre de raisons; mais, dans tous les cas, dans les paramètres, vous pouvez spécifier un autre utilitaire pour l'ouverture universelle des fichiers) . Cet utilitaire fonctionne bien sur différentes distributions avec différents environnements de travail, je recommande donc de l'installer avec vitis.
Vous pouvez également spécifier directement le programme d'ouverture des fichiers:
vitis open --app qmmp

Créons plus de catégories et ajoutons des fichiers en utilisant "assigner". Si des fichiers sont affectés à des catégories qui n'existent pas encore, une demande est émise pour leur création. Une demande inutile peut être évitée en utilisant l'indicateur --yes.
vitis assign R -f " R.pdf" " R: .pdf" --yes
Maintenant, nous voulons ajouter la catégorie "Mathématiques" au fichier "Paquet statistique R: théorie des probabilités et statistiques .pdf". Nous savons que ce fichier a déjà la catégorie "R" et nous pouvons donc utiliser le chemin catégorique du système Vitis:
vitis assign -v "R/ R: .pdf"
Heureusement, l'auto-complétion bash rendra cela facile.
Jetez un œil à ce qui s'est passé en utilisant l'indicateur --categories pour voir une liste de catégories pour chaque fichier:
vitis show R --categories

Notez que les fichiers ont également été affectés à des catégories automatiques par format, type (combine les formats) et extension de fichier. Ces catégories sont facultativement désactivées. Plus tard, je ferai certainement la localisation de leurs noms.
Nous ajouterons autre chose aux "Mathématiques" pour un changement:
vitis assign -f " - 1984.pdf" ___1927.djvu
Et maintenant, le plaisir commence. Au lieu de catégories, vous pouvez écrire des expressions avec des opérations d'union, d'intersection et de soustraction, c'est-à-dire utiliser des opérations sur des ensembles. Par exemple, l'intersection de "Mathématiques" avec "R" donnera un seul fichier.
vitis show R i:
Soustraire des références "Mathématiques" au langage "R":
vitis show \\ R # vitis show c: R
Nous pouvons combiner de manière transparente la musique et le langage R:
vitis show u: R
L'indicateur -n vous permet de "retirer" les fichiers nécessaires du résultat de la requête par des nombres et / ou des plages, par exemple, -n 3-7
, ou plus compliqué: -n 1,5,8-10,13
. Il est souvent utile avec la sous-commande open, qui vous permet d'ouvrir les fichiers nécessaires à partir de la liste.

Bien que nous nous éloignions de l'utilisation de la hiérarchie de répertoires habituelle, il est souvent utile d'avoir des catégories imbriquées. Créez une sous-catégorie "Statistiques" pour la catégorie "Mathématiques" et ajoutez cette catégorie au fichier approprié:
vitis create / vitis assign / -v "R/ R.pdf" vitis show --categories

Nous pouvons voir que ce fichier a maintenant la catégorie "Mathématiques / Statistiques" au lieu de "Mathématiques" (des liens supplémentaires sont suivis).
L'accès au chemin complet peut être gênant, créez un alias "global":
vitis assign / -a vitis show

Pas seulement des fichiers normaux
Liens Internet
Pour unifier le stockage de toute information, il serait utile au moins de classer les liens vers les ressources Internet. Et c'est possible:
vitis assign -i https://habr.com/ru/company/sfe_ru/blog/437304/ --yes
Dans un endroit spécial, un fichier avec l'en-tête de la page HTML et avec l'extension .desktop sera créé. Il s'agit du format de raccourci traditionnel dans GNU / Linux. Ces raccourcis obtiennent la catégorie NetworkBookmarks automatique.
Naturellement, des raccourcis sont créés pour les utiliser:
vitis open
L'exécution de la commande entraîne l'ouverture du lien qui vient d'être enregistré dans le navigateur. Les raccourcis classés vers les sources Internet peuvent remplacer les signets du navigateur.
Fragments de fichier
Il est également utile d'avoir des catégories pour les fragments de fichiers individuels. Belle offre, hein? Mais l'implémentation actuelle affecte jusqu'à présent uniquement les fichiers texte ordinaires, les fichiers audio et vidéo. Disons que vous devez noter un morceau spécifique d'un concert ou un moment amusant dans le film, puis lorsque vous utilisez assign, vous pouvez utiliser les drapeaux --fragname, --start, --finish. Enregistrez l'économiseur d'écran de Duck Tales:
vitis assign -c -f Duck_Tales/s01s01.avi --finish 00:00:59 --fragname "Duck Tales intro" vitis open
En fait, aucun écrêtage de fichiers ne se produit; à la place, un pointeur de fichier vers un fragment est créé, qui décrit le type de fichier, le chemin d'accès au fichier, le début et la fin du fragment. La création et l'ouverture de pointeurs vers des fragments est déléguée à des utilitaires spécialement conçus par moi à ces fins - ce sont les mediafragmenter et fragplayer. Le premier crée, le second s'ouvre. Dans le cas des enregistrements audio et vidéo, le lancement d'un fichier multimédia d'une certaine à une certaine position se produit à l'aide du lecteur VLC, il doit donc également être dans le système. Au début, je voulais le faire sur la base de mplayer, mais pour une raison quelconque, il était très tordu là-bas avec un positionnement au bon moment.
Dans notre exemple, le fichier "Duck Tales intro.fragpointer" est créé (il est placé dans un endroit spécial), puis un fragment est lu depuis le début du fichier (car --start n'a pas été spécifié lors de la création) jusqu'à la marque en 59 secondes, après quoi VLC ferme.
Un autre exemple - nous avons décidé de classer une performance distincte lors d'un concert d'un artiste célèbre:
vitis assign " " -f \ c\ -\ \ \ -\ \ \ .mp4 --fragname " " --start 00:32:18 --finish 00:36:51 vitis open " "
Lorsque vous ouvrez le fichier sera inclus dans la position souhaitée et après quatre minutes et demie, il se fermera.
Fonctionnement + fonctionnalités supplémentaires
Catégorie Stockage
Au tout début de la réflexion sur l'organisation du système de fichiers sémantique, j'ai trouvé trois voies: par le stockage de liens symboliques, par une base de données, par une description en XML. La première méthode a gagné parce que d'une part, il est facile à mettre en œuvre, et d'autre part, l'utilisateur a la possibilité de regarder les catégories directement à partir du système de fichiers (ce qui est pratique et important). Au début de l'utilisation de vitis , le répertoire «Vitis» et le fichier de configuration «.config / vitis / vitis.conf» sont créés dans le répertoire personnel de l'utilisateur. ~ / Vitis crée des répertoires correspondant aux catégories et, dans ces catégories, les répertoires créent des liens symboliques vers les fichiers d'origine. Les alias de catégorie ne sont que des liens vers eux. Bien entendu, la présence du répertoire "Vitis" dans le répertoire personnel peut ne pas convenir à quelqu'un. Nous pouvons passer à n'importe quel autre endroit:
vitis service set path /mnt/MyFavoriteDisk/Vitis/
À un certain moment, il devient clair que les fichiers dispersés à différents endroits ne sont pas significatifs à catégoriser, car leur emplacement peut changer. Par conséquent, pour commencer, j'ai créé un répertoire pour moi-même, où j'ai bêtement tout vidé et donné des catégories à tout cela. Il a ensuite décidé qu'il serait bien de formaliser ce moment au niveau logiciel. C'est ainsi qu'est apparu le concept «d'espace fichier». Au début de l'utilisation de vitis , cela ne ferait pas de mal de configurer immédiatement un tel endroit (tous les fichiers dont nous avons besoin y seront stockés) et d'activer la sauvegarde automatique:
vitis service add filespace /mnt/MyFavoriteDisk/Filespace/ vitis service set autosave yes
Sans enregistrement automatique, l'utilisation de la sous-commande "assign" nécessitera l'indicateur --save si vous souhaitez enregistrer le fichier ajouté dans l'espace fichier.
De plus, vous pouvez ajouter plusieurs espaces fichier et modifier leurs priorités, cela peut être utile lorsqu'il y a beaucoup de fichiers et qu'ils sont stockés sur différents supports. Ici, je ne considérerai pas cette possibilité, des détails peuvent être trouvés dans l'aide du programme.
Migration du système de fichiers sémantique
D'une manière ou d'une autre, le répertoire Vitis et les espaces fichier peuvent théoriquement parfois se déplacer d'un endroit à l'autre. Pour le faire fonctionner, j'ai créé un utilitaire d' éditeur de liens distinct qui peut modifier en masse les liens, en remplaçant certaines parties du chemin par d'autres:
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
Dans le premier cas, après avoir déplacé de / mnt / MyFavoriteDisk / Vitis / vers le répertoire personnel, les liens symboliques associés aux alias sont modifiés. Dans le deuxième cas, après avoir changé l'emplacement de l'espace fichier, tous les liens dans Vitis changent en nouveaux en fonction de la demande de remplacement d'une partie de leur chemin.
Catégories automatiques
Si vous exécutez la commande vitis service get autocategorization
, vous pouvez voir que le paramètre par défaut des catégories automatiques est le format (Format et Type) et l'extension de fichier (Extension).
Ceci est utile lorsque, par exemple, vous devez trouver quelque chose parmi les PDF ou regarder ce que vous avez stocké à partir de MOBI et FB2, vous pouvez simplement exécuter la demande
vitis show Format/MOBI u: Format/FB2
Il se trouve que les outils GNU / Linux standard comme fichier ou mimetype ne me convenaient pas précisément parce qu'ils ne déterminent pas toujours correctement le format, j'ai dû faire ma propre implémentation en fonction des signatures de fichiers et des extensions. En général, le sujet pour déterminer les formats de fichiers est un sujet de recherche intéressant et mérite un article séparé. Pour l'instant, je peux dire que, peut-être, pas pour tous les formats dans le monde, j'ai prévu une véritable reconnaissance, mais en général cela fonctionne assez bien en ce moment. Certes, le format EPUB est désormais défini comme ZIP (en général, il est justifié, mais en pratique, cela ne devrait pas être considéré comme un comportement normal). Jusqu'à présent, considérez cette fonctionnalité comme expérimentale, signalez les bugs. Dans des situations étranges, vous pouvez toujours utiliser des catégories par extension de fichier, par exemple, Extension / epub.
Si des catégories automatiques par format sont incluses, des catégories automatiques sont également incluses, combinant certains formats par type: "Archives", "Images", "Vidéo", "Audio" et "Documents". Des noms localisés seront également créés pour ces sous-catégories.
Ce qui n'est pas dit
vitis s'est avéré être un outil à multiples facettes, et il est difficile de tout couvrir à la fois. Mentionnez brièvement ce que vous pouvez faire d'autre:
- Les catégories peuvent être supprimées et supprimées des fichiers;
- les résultats des requêtes d'expressions peuvent être copiés dans le répertoire spécifié;
- les fichiers peuvent être exécutés en tant que programmes;
- La commande show a de nombreuses options, par exemple, le tri par nom / date de modification ou accès / taille / extension, montrant les propriétés des fichiers et les chemins vers les originaux, activant l'affichage des fichiers cachés, etc.;
- Lorsque vous enregistrez des liens vers des sources Internet, vous pouvez également enregistrer des copies locales de pages HTML.
Tous les détails peuvent être trouvés dans l'aide à l'utilisateur.
Perspectives
Souvent, les sceptiques disent que "personne ne mettra ces étiquettes lui-même". En utilisant mon exemple, je peux prouver le contraire: j'ai déjà catégorisé plus de six mille fichiers, créé plus de mille catégories et alias, et ça valait le coup. Lorsque vous vitis open
une liste de vos affaires avec une équipe vitis open
ou lorsque vous vitis open LaTeX
le livre de Stolyarov sur le système de mise en page LaTeX avec une équipe vitis open LaTeX
, il est moralement difficile d'utiliser le système de fichiers «à l'ancienne».
Sur cette base, un certain nombre d'idées surgissent. Par exemple, vous pouvez créer une radio automatique qui inclut de la musique à thème en fonction de la météo, des vacances, du jour de la semaine, de l'heure de la journée ou de l'année. Toujours proche du sujet est un lecteur de musique qui connaît les catégories et peut jouer de la musique par expression avec des opérations sur les catégories comme sur les décors. Il est utile de créer un démon qui gardera une trace du répertoire Downloads et proposera de catégoriser les nouveaux fichiers. Bien sûr, vous devez créer un gestionnaire de fichiers sémantique graphique normal. Une fois, j'ai même créé un service Web pour l'entreprise pour le partage de fichiers, mais ce n'était pas une priorité et est devenu hors de propos, bien qu'il atteigne un niveau de performance élevé. (En raison des grands changements dans vitis lui-même, il est déjà inutilisable.)
voici une petite démonstration Conclusion
Vitis n'est pas la première tentative de changer radicalement le style de travail avec les données, mais j'ai considéré qu'il était important de mettre en œuvre mes idées et de mettre la mise en œuvre dans le domaine public sous la licence GNU GPL. Pour plus de commodité, un paquet deb pour x86-64 a été créé, il devrait fonctionner sur toutes les distributions Debian modernes. Sur ARM, il y a eu des difficultés mineures (alors que tous les autres programmes liés à vitis fonctionnent bien), mais à l'avenir, un package de travail sera également construit pour cette plateforme (armhf). Jusqu'à présent, j'ai cessé de créer des packages RPM en raison de problèmes sur Fedora 30 et de la difficulté de pulvériser sur de nombreuses distributions RPM, mais plus tard, au moins quelques-uns d'entre eux créeront des packages. En attendant, vous pouvez utiliser make && make install
ou checkinstall
.
Merci à tous pour votre attention! J'espère que cet article et ce projet pourront être utiles.
Lien vers le référentiel du projet