La clasificación de datos es en sí misma un tema interesante para la investigación. Me gusta coleccionar información que parece necesaria y siempre he tratado de hacer jerarquías lógicas de directorios para mis archivos. Una vez, en un sueño, vi un programa hermoso y conveniente para asignar etiquetas a los archivos, y decidí que no podía seguir viviendo así.
El problema de los sistemas de archivos jerárquicos
Los usuarios a menudo se enfrentan al dilema de dónde guardar el nuevo archivo y al problema de encontrar sus propios archivos (a veces los nombres de los archivos ni siquiera están diseñados para ser recordados por un ser humano).
Una solución a esta situación puede ser los sistemas de archivos semánticos, que generalmente son una capa adicional sobre el sistema de archivos tradicional. En ellos, los directorios son reemplazados por atributos semánticos, también conocidos como etiquetas, categorías o metadatos. Usaré más a menudo el término "categoría", ya que en el contexto de los sistemas de archivos la palabra "etiqueta" a veces suena extraña, especialmente cuando aparecen "subetiquetas" y "alias de etiquetas".
Asignar categorías a los archivos elimina en gran medida los problemas de almacenamiento y búsqueda de archivos: si recuerdas (o sospechas) al menos una de las categorías asignadas al archivo, este nunca desaparecerá de la vista.
Anteriormente, este tema se ha abordado varias veces en Habré (, , , y otros), aquí describo mi solución.
El camino hacia la implementación
Justo después del mencionado sueño, describí en un cuaderno una interfaz de línea de comandos que proporcionaría la funcionalidad necesaria para trabajar con categorías. Entonces decidí que en una o dos semanas podría escribir un prototipo utilizando Python o Bash, y luego tendría que trabajar en la creación de una interfaz gráfica con Qt o GTK. La realidad, como siempre, resultó ser mucho más dura y el desarrollo se alargó.
La idea inicial era crear un programa con una interfaz de línea de comandos cómoda y concisa que permitiera crear y eliminar categorías, asignar categorías a archivos y eliminar categorías de archivos. Llamé al programa vitis.
El primer intento de crear vitis terminó en nada, ya que se comenzó a invertir mucho tiempo en el trabajo y la universidad. El segundo intento fue algo más: logré completar el proyecto que había planeado para la tesis de maestría e incluso hacer un prototipo de la interfaz GTK. Pero esa versión resultó ser tan poco confiable y poco práctica, que tuve que repensar muchas cosas.
En la tercera versión, ya la utilicé yo mismo durante mucho tiempo, clasificando varios miles de mis archivos. Esto fue favorecido en gran medida por la auto-completación de bash implementada. Pero algunos problemas, como la falta de categorías automáticas y la posibilidad de almacenar archivos con el mismo nombre, seguían existiendo, y el programa ya estaba colapsando bajo su propia complejidad. Así llegué a la necesidad de resolver los problemas del desarrollo de software complejo: escribir requisitos detallados, desarrollar un sistema de pruebas funcionales, estudiar guías sobre empaquetado y mucho más. Ahora he llegado a lo planeado, así que esta modesta creación puede ser presentada a la comunidad libre. Esta gestión de archivos tan específica, como la gestión a través del concepto de categorías, plantea cuestiones y problemas inesperados, y en su resolución. vitis generó a su alrededor cinco proyectos más, algunos de ellos se mencionarán en el artículo. Hasta hoy. vitis no he adquirido una interfaz gráfica, pero la comodidad de usar categorías de archivos desde la línea de comandos ya supera para mí cualquier ventaja de un administrador de archivos gráfico convencional.
Ejemplos de uso
Comencemos con algo sencillo: crearemos una categoría:
vitis create MúsicaAgreguemos para ejemplo alguna composición:
vitis assign Música -f "The Ink Spots - I Don't Want To Set The World On Fire.mp3"Se puede ver el contenido de la categoría «Música» con el subcomando «show»:
vitis show MúsicaSe puede reproducir utilizando el subcomando «open»
vitis open MúsicaComo en la categoría «Música» solo hay un archivo, solo se iniciará él. Para abrir archivos con programas predeterminados, hice una utilidad separada. vts-fs-open (los medios estándar como xdg-open o mimeopen no me satisfacían por varias razones; pero, si deseas, en la configuración puedes especificar otra utilidad para abrir archivos de manera universal). Esta utilidad funciona bastante bien en diferentes distribuciones con diferentes entornos de escritorio, por lo que recomiendo instalarla junto con vitis.
También se puede especificar directamente el programa para abrir archivos:
vitis open Música --app qmmp
Crearemos más categorías y añadiremos archivos mediante «assign». Si los archivos se asignan a categorías que aún no existen, se solicita su creación. Se puede evitar un pedido innecesario utilizando la bandera —yes.
vitis assign Programación R -f "Introducción a R.pdf" "Paquete estadístico R: teoría de probabilidades y estadística.pdf" --yesAhora queremos añadir la categoría «Matemáticas» al archivo «Paquete estadístico R: teoría de probabilidades y estadística.pdf». Sabemos que este archivo ya tiene la categoría «R» y por lo tanto podemos utilizar la ruta de categorías del sistema Vitis:
vitis assign Matemáticas -v "R/Paquete estadístico R: teoría de probabilidades y estadística.pdf"Afortunadamente, la autocompleción de bash permitirá hacer esto fácilmente.
Veamos qué hemos conseguido, utilizando la bandera —categories para ver la lista de categorías de cada archivo:
vitis show R --categories
Ten en cuenta que también se han asignado categorías automáticas a los archivos según el formato, tipo (combinando formatos) y extensión de los archivos. Estas categorías se pueden desactivar si se desea. Más adelante, definitivamente haré la localización de sus nombres.
Agreguemos algo más a «Matemáticas» para variar:
vitis assign Matemáticas -f "Análisis matemático - 1984.pdf" Perelman_Matemáticas_interesantes_1927.djvu Ahora empieza lo interesante. En lugar de categorías, se pueden escribir expresiones con operaciones de unión, intersección y diferencia, es decir, utilizar operaciones sobre conjuntos. Por ejemplo, la intersección de «Matemáticas» con «R» dará como resultado un archivo.
vitis show R i: MatemáticasRestaremos las menciones del lenguaje «R» de «Matemáticas»:
vitis show Matemáticas R #o vitis show Matemáticas c: RPodemos combinar sin rumbo la música y el lenguaje R:
vitis show Música u: RLa bandera -n permite "extraer" del resultado de la consulta los archivos necesarios por números y/o rangos, por ejemplo, -n 3-7, o algo más complejo: -n 1,5,8-10,13. A menudo es útil con el subcomando open, que permite abrir los archivos necesarios de la lista.

Aunque nos alejamos del uso de una jerarquía de directorios convencional, a menudo es útil tener categorías anidadas. Crearemos una subcategoría «Estadística» en la categoría «Matemáticas» y añadiremos esta categoría al archivo adecuado:
vitis create Matemáticas/Estadística
vitis assign Matemáticas/Estadística -v "R/Introducción a R.pdf"
vitis show Matemáticas --categories
Podemos ver que este archivo ahora tiene la categoría «Matemáticas/Estadística» en lugar de «Matemáticas» (los enlaces innecesarios están siendo rastreados).
Referirse a la ruta completa puede ser incómodo, así que crearemos un pseudónimo «global»:
vitis assign Matemáticas/Estadística -a Estadística
vitis show Estadística
No solo archivos comunes
Enlaces de Internet
Para unificar el almacenamiento de cualquier información, sería útil, al menos, categorizar los enlaces a recursos de Internet. Y es posible:
vitis assign Habr ColorAnomalía -i https://habr.com/es/company/sfe_ru/blog/437304/ --yesEn un lugar especial se creará un archivo con el título de la página HTML y con la extensión .desktop. Este es el formato tradicional de acceso directo en GNU/Linux. Estos accesos directos reciben automáticamente la categoría NetworkBookmarks.
Naturalmente, los accesos directos se crean para ser utilizados:
vitis open ColorAnomalíaLa ejecución del comando provoca que se abra en el navegador el enlace que se guardó recientemente. Los accesos directos categorizados a las fuentes de Internet pueden servir como reemplazo de los marcadores del navegador.
Fragmentos de archivos
También es útil tener categorías para fragmentos individuales de archivos. ¿No suena mal? Pero la implementación actual solo afecta a archivos de texto comunes, de audio y de video. Digamos, necesitas marcar un cierto pedazo de algún concierto o un momento divertido de una película, entonces, al usar assign, puedes usar las banderas —fragname, —start, —finish. Vamos a guardar la introducción de «Cuentos de Pato»:
vitis assign vitis assign -c Introducciones -f Duck_Tales/s01s01.avi --finish 00:00:59 --fragname "Introducción de Duck Tales"
vitis open IntroduccionesRealmente no se está cortando ningún archivo, en su lugar, se crea un archivo puntero al fragmento, que describe el tipo de archivo, la ruta al archivo, el inicio y el final del fragmento. La creación y apertura de punteros a fragmentos se delega a utilidades, que he diseñado específicamente para estos fines: mediafragmenter y fragplayer. El primero crea, el segundo abre. En el caso de grabaciones de audio y video, la ejecución del archivo multimedia desde una posición específica hasta una posición determinada se realiza con el reproductor VLC, así que también debe estar en el sistema. Al principio quería hacer esto basado en mplayer, pero allí, por alguna razón, fue muy torpe con el posicionamiento en el momento correcto.
En nuestro ejemplo, se crea un archivo "Duck Tales intro.fragpointer" (que se coloca en un lugar específico), y luego se reproduce un fragmento desde el inicio del archivo (ya que no se especificó —start al crear) hasta la marca de 59 segundos, después de lo cual VLC se cierra.
Otro ejemplo sería clasificar una actuación específica en un concierto de algún artista famoso:
vitis assign Лепс "Спасите наши души" -f Григорий Лепc - Концерт Парус - песни Владимира Высоцкого.mp4 --fragname "Спасите наши души" --start 00:32:18 --finish 00:36:51
vitis open "Спасите наши души"Al abrir, el archivo se incluirá en la posición correcta y se cerrará después de cuatro minutos y medio.
Cómo funciona todo esto + funcionalidades adicionales
Almacenamiento de categorías
Al inicio del diseño de un sistema de archivos semántico, se me ocurrieron tres métodos: mediante el almacenamiento de enlaces simbólicos, a través de una base de datos, y mediante una descripción en XML. Ganó el primer método, ya que, por un lado, es fácil de implementar, y por otro, el usuario tiene la posibilidad de ver las categorías directamente desde el sistema de archivos (lo cual es conveniente e importante). Al principio de su uso vitis en el directorio personal del usuario se crea un directorio "Vitis" y un archivo de configuración ".config/vitis/vitis.conf". En ~\/Vitis se crean directorios correspondientes a las categorías, y dentro de esos directorios-categorías se crean enlaces simbólicos a los archivos originales. Los alias de categoría también son simplemente enlaces a ellos. Por supuesto, la existencia del directorio "Vitis" en el directorio personal puede no gustarle a alguien. Podemos cambiar a cualquier otro lugar:
vitis service set path \/mnt\/MyFavoriteDisk\/Vitis\/En un momento determinado, queda claro que categorizar archivos dispersos en diferentes lugares tiene poco sentido, ya que su ubicación puede cambiar. Por lo tanto, inicialmente creé un directorio donde simplemente almacenaba todo y le daba categorías. Luego decidí que sería bueno formalizar esto a nivel de programación. Así nació el concepto de "espacio de archivos". Al principio de su uso vitis no estaría de más configurar un lugar como este (donde se almacenarán todos los archivos que necesitamos) e incluir el guardado automático:
vitis service add filespace \/mnt\/MyFavoriteDisk\/Filespace\/
vitis service set autosave yesSin la función de autoguardado al utilizar el subcomando «assign», será necesario el flag —save si se desea guardar el archivo agregado en el espacio de archivos.
Además, se pueden agregar varios espacios de archivos y cambiar su prioridad, lo cual puede ser útil cuando hay muchos archivos y están almacenados en diferentes dispositivos. Aquí no revisaré esta posibilidad, los detalles se pueden leer en la ayuda del programa.
Migración del sistema de archivos semántico
De una forma u otra, el directorio Vitis y los espacios de archivos teóricamente pueden moverse de un lugar a otro. Para hacerlos funcionar he creado una utilidad separada link-editor, que puede editar enlaces en masa, reemplazando partes de la ruta por otras:
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 -REn el primer caso, después de movernos de /mnt/MyFavoriteDisk/Vitis/ al directorio personal, se editan los enlaces simbólicos asociados con los alias. En el segundo caso, después de cambiar la ubicación del espacio de archivos, se actualizan todos los enlaces en Vitis a los nuevos conforme a la solicitud de reemplazo de parte de su ruta.
Categorías automáticas
Si se ejecuta el comando vitis service get autocategorization, se puede ver que por defecto está configurada la asignación de categorías automáticas por formato (Format y Type) y extensión de archivos (Extension).
Esto es útil, por ejemplo, cuando necesitas encontrar algo entre PDFs o mirar lo que tienes almacenado de EPUB y FB2, simplemente puedes ejecutar la consulta
vitis show Format/MOBI u: Format/FB2Resulta que las herramientas estándar de GNU/Linux como file o mimetype no me satisfacen precisamente porque no siempre determinan correctamente el formato, así que tuve que crear mi propia implementación basada en las firmas de archivos y extensiones. En general, el tema de la identificación de formatos de archivos es un asunto interesante para investigar y merece un artículo aparte. Por ahora puedo decir que, aunque quizás no he previsto un reconocimiento preciso para todos los formatos en el mundo, en general, ya está funcionando bastante bien. Aunque, para el EPUB, actualmente se identifica el formato como ZIP (lo cual es razonable, pero en la práctica no debería considerarse un comportamiento normal). Hasta cierto punto, consideren esta función como experimental y por favor, reporten los errores. En situaciones extrañas, siempre se pueden usar categorías por extensión de archivos, por ejemplo, Extension/epub.
Si las autocategorías por formato están habilitadas, también hay autocategorías que agrupan algunos formatos por tipo: 'Archivos', 'Imágenes', 'Video', 'Audio' y 'Documentos'. Para estas subcategorías también se crearán nombres localizados.
De lo que no se dice
vitis se convirtió en una herramienta muy versátil y es difícil abarcar todo de una vez. Mencionaré brevemente lo que aún se puede hacer:
- se pueden eliminar categorías y desasociarlas de los archivos;
- los resultados de las consultas se pueden copiar en el directorio indicado;
- los archivos se pueden ejecutar como programas;
- el comando show tiene muchas opciones, por ejemplo, ordenar por nombre/fecha de modificación o acceso/tamaño/extensión, mostrar propiedades de archivos y rutas a los originales, incluir la visualización de archivos ocultos, entre otros;
- al guardar enlaces a fuentes de Internet, también se pueden guardar copias locales de las páginas HTML.
Todos los detalles se pueden encontrar en la ayuda del usuario.
Perspectivas
A menudo, los escépticos dicen que 'nadie va a etiquetar estos tags por sí mismo'. Puedo demostrar lo contrario con mi ejemplo: ya he categorizado más de seis mil archivos, creado más de mil categorías y sinónimos, y ha valido la pena. Cuando con un solo comando vitis open Plan abres la lista de tus tareas o cuando con un solo comando vitis open LaTeX abres el libro de Stolyarov sobre el sistema de composición LaTeX, ya es moralmente complicado usar el sistema de archivos 'a la antigua'.
A partir de esto surgen varias ideas. Por ejemplo, se podría crear una radio automática que reproduzca música temática según el clima actual, una festividad, el día de la semana, la hora del día o la época del año. También es similar a esto un reproductor musical que conozca sobre categorías y pueda reproducir música mediante expresiones con operaciones sobre categorías como conjuntos. Sería útil crear un demonio que supervise la carpeta 'Descargas' y sugiera categorizar nuevos archivos. Y, por supuesto, sería necesario desarrollar un gestor de archivos gráfico semántico adecuado. En su momento, incluso creé un servicio web para uso colectivo de archivos, pero no era una prioridad y se volvió obsoleto, aunque alcanzó un alto nivel de funcionalidad. (Debido a los grandes cambios en sí mismo vitis, ya no es utilizable.)
aquí hay una pequeña demostración

Conclusión
Vitis — no es el primer intento de cambiar radicalmente el estilo de trabajo con los datos, pero consideré importante implementar mis ideas y publicar la implementación de forma abierta bajo la licencia GNU GPL. Para mayor comodidad, se ha hecho un paquete deb para x86-64, debería funcionar en todas las distribuciones Debian modernas. En ARM surgieron algunas complicaciones (sin embargo, todos los demás programas relacionados con vitis, funcionan correctamente), pero más adelante también se ensamblará un paquete funcional para esta plataforma (armhf). He dejado de crear paquetes RPM por problemas con Fedora 30 y la dificultad de diversificarme en muchas distribuciones RPM, pero más adelante se crearán paquetes al menos para un par de ellas. Por ahora se puede usar make && make install o checkinstall.
¡Gracias a todos por su atención! Espero que este artículo y este proyecto puedan ser útiles.
Fuente: habr.com
