Categorías en lugar de directorios, o el sistema de archivos semántico para Linux

La clasificación de los datos es en sí misma un tema interesante para la investigación. Me gusta recopilar información que parece necesaria, y siempre intenté hacer jerarquías lógicas de directorios para mis archivos, y una vez en un sueño, vi un programa hermoso y conveniente para asignar etiquetas a los archivos, y decidí que era imposible vivir así.


El problema de los sistemas de archivos jerárquicos


Los usuarios a menudo encuentran el problema de elegir la ubicación para guardar el próximo archivo nuevo y el problema de encontrar sus propios archivos (a veces los nombres de los archivos no están destinados al almacenamiento humano).


La solución a esta situación pueden ser los sistemas de archivos semánticos, que generalmente son un complemento de un sistema de archivos tradicional. Los directorios en ellos son reemplazados por atributos semánticos, también llamados etiquetas, categorías, metadatos. Usaré el término "categoría" más a menudo, como en el contexto de los sistemas de archivos, la palabra "etiqueta" a veces es extraña, especialmente cuando aparecen "subetiquetas" y "alias de etiqueta".


La asignación de categorías a archivos elimina en gran medida los problemas de almacenamiento y búsqueda de archivos: si recuerda (o adivina) al menos una de las categorías asignadas al archivo, el archivo nunca se perderá de vista.


Anteriormente en Habré, este tema se planteó más de una vez ( uno , dos , tres , cuatro , etc.), aquí describo mi decisión.


Ruta de implementación


Inmediatamente después del sueño antes mencionado, describí en un cuaderno la interfaz de comando que proporciona el trabajo necesario con categorías. Luego decidí que en una o dos semanas puedes escribir un prototipo usando Python o Bash, y luego tendrás que trabajar en la creación de un shell gráfico en Qt o GTK. La realidad, como siempre, resultó ser mucho más severa, y el desarrollo se prolongó.


La idea inicial era crear primero un programa con una interfaz de línea de comandos conveniente y concisa que creara, eliminara categorías, asignara categorías a archivos y eliminara categorías de archivos. Llamé al programa vitis .


El primer intento de crear vitis terminó en nada, ya que mucho tiempo comenzó a ir al trabajo y a la universidad. El segundo intento ya fue algo: por la tesis de maestría logramos terminar el proyecto planificado e incluso hacer un prototipo de la carcasa GTK. Pero esa versión resultó ser tan poco confiable e incómoda que tuve que repensar mucho.


Ya usé la tercera versión durante mucho tiempo, traduciendo varios miles de mis archivos en categorías. Esto, entre otras cosas, fue facilitado en gran medida por la finalización de bash implementada. Pero algunos problemas, como la falta de categorías automáticas y la capacidad de almacenar archivos con el mismo nombre, aún permanecían, y el programa ya estaba doblado bajo su propia complejidad. Entonces llegué a la necesidad de resolver los problemas de desarrollar software complejo: escribir requisitos detallados, desarrollar un sistema de prueba funcional, estudiar las instrucciones de empaque y mucho más. Ahora he llegado a un plan, por lo que esta modesta creación se puede presentar a la comunidad gratuita. Dicha gestión de archivos específica, como la gestión a través del concepto de categorías, toca preguntas y problemas inesperados, y al resolverlos, generó cinco proyectos más a su alrededor, algunos de los cuales se mencionarán en el artículo. Hasta ahora, vitis no ha adquirido un shell gráfico, pero la conveniencia de usar categorías de archivos desde la línea de comandos ya cubre para mí cualquier ventaja del administrador de archivos gráfico habitual.


Ejemplos de uso


Comencemos con uno simple: cree una categoría:


vitis create  

Agreguemos un poco de composición como ejemplo:


 vitis assign  -f "The Ink Spots - I Don't Want To Set The World On Fire.mp3" 

Puede ver el contenido de la categoría Música con el comando show:


 vitis show  

Puedes jugarlo usando el subcomando "abierto"


 vitis open  

Porque solo tenemos un archivo en la categoría "Música", luego solo se iniciará. Con el fin de abrir archivos con sus programas, por defecto hice una utilidad separada vts-fs-open (las herramientas estándar como xdg-open o mimeopen no me convenían por varias razones; pero, en todo caso, en la configuración puede especificar otra utilidad para la apertura universal de archivos) . Esta utilidad funciona bien en diferentes distribuciones con diferentes entornos de trabajo, por lo que recomiendo instalarla junto con vitis.


También puede especificar directamente el programa para abrir archivos:


 vitis open  --app qmmp 


Creemos más categorías y agreguemos archivos usando "asignar". Si los archivos se asignan a categorías que aún no existen, se emite una solicitud para su creación. Se puede evitar una solicitud innecesaria utilizando el indicador --yes.


 vitis assign  R -f "  R.pdf" "  R:    .pdf" --yes 

Ahora queremos agregar la categoría "Matemáticas" al archivo "Paquete estadístico R: teoría de probabilidad y estadística .pdf". Sabemos que este archivo ya tiene la categoría "R" y, por lo tanto, podemos usar la ruta categórica desde el sistema Vitis:


 vitis assign  -v "R/  R:    .pdf" 

Afortunadamente, bash auto-complete hará que esto sea fácil de hacer.


Eche un vistazo a lo que sucedió usando el indicador --categories para ver una lista de categorías para cada archivo:


 vitis show R --categories 


Tenga en cuenta que a los archivos también se les asignaron categorías automáticas por formato, tipo (combina formatos) y extensión de archivo. Estas categorías están opcionalmente deshabilitadas. Más tarde, definitivamente haré la localización de sus nombres.


Agregaremos algo más a las "Matemáticas" para variar:


 vitis assign  -f "  - 1984.pdf" ___1927.djvu 

Y ahora comienza la diversión. En lugar de categorías, puede escribir expresiones con operaciones de unión, intersección y sustracción, es decir, usar operaciones en conjuntos. Por ejemplo, la intersección de "Matemáticas" con "R" dará como resultado un archivo.


 vitis show R i:  

Reste de las referencias de "Matemáticas" al lenguaje "R":


 vitis show  \\ R # vitis show  c: R 

Podemos combinar perfectamente la música y el lenguaje R:


 vitis show  u: R 

El indicador -n le permite "extraer" los archivos necesarios del resultado de la consulta por números y / o rangos, por ejemplo, -n 3-7 , o más complicados: -n 1,5,8-10,13 . A menudo es útil con el subcomando abierto, que le permite abrir los archivos que necesita de la lista.



Aunque nos estamos alejando del uso de la jerarquía de directorios habitual, a menudo es útil tener categorías anidadas. Cree una subcategoría "Estadísticas" para la categoría "Matemáticas" y agregue esta categoría al archivo apropiado:


 vitis create / vitis assign / -v "R/  R.pdf" vitis show  --categories 


Podemos ver que este archivo ahora tiene la categoría "Matemáticas / Estadística" en lugar de "Matemáticas" (se rastrean enlaces adicionales).


Acceder a la ruta completa puede ser un inconveniente, cree un alias "global":


 vitis assign / -a  vitis show  


No solo archivos regulares


Enlaces de internet


Para unificar el almacenamiento de cualquier información, sería útil al menos clasificar los enlaces a los recursos de Internet. Y es posible:


 vitis assign   -i https://habr.com/ru/company/sfe_ru/blog/437304/ --yes 

En un lugar especial, se creará un archivo con el encabezado de la página HTML y con la extensión .desktop. Este es el formato de acceso directo tradicional en GNU / Linux. Estos accesos directos obtienen la categoría automática de NetworkBookmarks.


Naturalmente, se crean accesos directos para usarlos:


 vitis open  

La ejecución del comando conduce a la apertura del enlace recién guardado en el navegador. Los accesos directos categorizados a fuentes de Internet pueden reemplazar los marcadores del navegador.


Fragmentos de archivo


También es útil tener categorías para fragmentos de archivos individuales. Buena oferta, ¿eh? Pero la implementación actual hasta ahora afecta solo a los archivos de texto ordinarios, archivos de audio y video. Digamos que necesita anotar una pieza específica de un concierto o un momento divertido en la película, luego, cuando use asignar, puede usar las banderas --fragname, --start, --finish. Guarde el protector de pantalla de Duck Tales:


 vitis assign -c  -f Duck_Tales/s01s01.avi --finish 00:00:59 --fragname "Duck Tales intro" vitis open  

En realidad, no ocurre recorte de archivos; en su lugar, se crea un puntero de archivo a un fragmento, que describe el tipo de archivo, la ruta al archivo, el principio y el final del fragmento. La creación y apertura de punteros a fragmentos se delega a utilidades especialmente creadas por mí para estos fines: estos son mediafragmenter y fragplayer. El primero crea, el segundo se abre. En el caso de grabaciones de audio y video, el lanzamiento de un archivo multimedia desde una posición determinada a una determinada se produce utilizando el reproductor VLC, por lo que también debe estar en el sistema. Al principio quería hacerlo sobre la base de mplayer, pero por alguna razón estaba muy torcido allí con el posicionamiento en el momento correcto.
En nuestro ejemplo, se crea el archivo "Duck Tales intro.fragpointer" (se coloca en un lugar especial), y luego se reproduce un fragmento desde el principio del archivo (porque --start no se especificó al crear) a la marca en 59 segundos, después de lo cual VLC cierra


Otro ejemplo: decidimos clasificar una actuación por separado en un concierto de algún artista famoso:


 vitis assign  "  " -f \ c\ -\ \ \ -\ \ \ .mp4 --fragname "  " --start 00:32:18 --finish 00:36:51 vitis open "  " 

Cuando abra el archivo se incluirá en la posición deseada y después de cuatro minutos y medio se cerrará.


Cómo funciona todo + características adicionales


Categoría de almacenamiento


Al principio de pensar en la organización del sistema de archivos semántico, se me ocurrieron tres formas: almacenando enlaces simbólicos, a través de una base de datos, a través de una descripción en XML. El primer método ganó porque Por un lado, es fácil de implementar y, por otro, el usuario tiene la oportunidad de ver categorías directamente desde el sistema de archivos (y esto es conveniente e importante). Al comienzo del uso de vitis , el directorio "Vitis" y el archivo de configuración ".config / vitis / vitis.conf" se crean en el directorio de inicio del usuario. ~ / Vitis crea directorios correspondientes a categorías, y en estos directorios de categoría crea enlaces simbólicos a los archivos originales. Los alias de categoría también son solo enlaces a ellos. Por supuesto, la presencia del directorio "Vitis" en el directorio de inicio puede no ser adecuado para alguien. Podemos cambiar a cualquier otro lugar:


 vitis service set path /mnt/MyFavoriteDisk/Vitis/ 

En cierto punto, queda claro que los archivos dispersos en diferentes lugares no son significativos para clasificar, ya que su ubicación puede cambiar. Por lo tanto, para empezar, creé un directorio para mí, donde estúpidamente volqué todo y le di categorías a todo. Luego decidió que sería bueno formalizar este momento a nivel de software. Entonces apareció el concepto de "espacio de archivos". Al comienzo de usar vitis , no estaría de más configurar de inmediato un lugar así (todos los archivos que necesitamos se almacenarán allí) y habilitar el autoguardado:


 vitis service add filespace /mnt/MyFavoriteDisk/Filespace/ vitis service set autosave yes 

Sin el guardado automático, el uso del subcomando "asignar" requerirá el indicador --save si desea guardar el archivo agregado en el espacio de archivos.


Además, puede agregar varios espacios de archivos y cambiar sus prioridades, esto puede ser útil cuando hay muchos archivos y se almacenan en diferentes medios. Aquí no consideraré esta posibilidad, los detalles se pueden encontrar en la ayuda para el programa.


Migración del sistema de archivos semántico.


De una forma u otra, el directorio de Vitis y los espacios de archivos teóricamente a veces pueden moverse de un lugar a otro. Para que funcione, creé una utilidad de editor de enlaces separada que puede editar en masa los enlaces, reemplazando partes de la ruta con 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 -R 

En el primer caso, después de pasar de / mnt / MyFavoriteDisk / Vitis / al directorio de inicio, se editan los enlaces simbólicos asociados con los alias. En el segundo caso, después de cambiar la ubicación del espacio de archivo, todos los enlaces en Vitis cambian a nuevos según la solicitud de reemplazar parte de su ruta.


Categorías de autos


Si ejecuta el vitis service get autocategorization , puede ver que la configuración predeterminada de las categorías automáticas es por formato (Formato y Tipo) y extensión de archivo (Extensión).


Esto es útil cuando, por ejemplo, necesita encontrar algo entre archivos PDF o mirar lo que ha almacenado de MOBI y FB2, simplemente puede ejecutar la solicitud


 vitis show Format/MOBI u: Format/FB2 

Dio la casualidad de que las herramientas estándar de GNU / Linux como file o mimetype no me convenían precisamente porque no siempre determinan correctamente el formato, tuve que hacer mi propia implementación basada en firmas y extensiones de archivos. En general, el tema para determinar los formatos de archivo es un tema interesante para la investigación y merece un artículo separado. Por ahora, puedo decir que, tal vez, no para todos los formatos en el mundo, proporcioné un verdadero reconocimiento, pero en general está funcionando bastante bien en este momento. Es cierto que el formato EPUB ahora se define como ZIP (en general, está justificado, pero en la práctica esto no debe considerarse un comportamiento normal). Hasta ahora, considere esta característica experimental, informe de errores. En situaciones extrañas, siempre puede usar categorías por extensión de archivo, por ejemplo, Extensión / epub.


Si se incluyen categorías automáticas por formato, también se incluyen categorías automáticas, que combinan algunos formatos por tipo: "Archivos", "Imágenes", "Video", "Audio" y "Documentos". También se crearán nombres localizados para estas subcategorías.


Lo que no se dice


Vitis resultó ser una herramienta muy multifacética, y es difícil cubrir todo a la vez. Mencione brevemente qué más puede hacer:


  • Las categorías se pueden eliminar y eliminar de los archivos;
  • los resultados de las consultas para expresiones se pueden copiar en el directorio especificado;
  • los archivos se pueden ejecutar como programas;
  • El comando show tiene muchas opciones, por ejemplo, ordenar por nombre / fecha de cambio o acceso / tamaño / extensión, mostrar las propiedades del archivo y las rutas a los originales, activar la visualización de archivos ocultos, etc.;
  • Cuando guarda enlaces a fuentes de Internet, también puede guardar copias locales de páginas HTML.

Todos los detalles se pueden encontrar en la ayuda del usuario.


Perspectivas


A menudo, los escépticos dicen que "nadie pondrá estas etiquetas por sí mismo". Utilizando mi ejemplo, puedo demostrar lo contrario: ya he categorizado más de seis mil archivos, creado más de mil categorías y alias, y valió la pena. Cuando vitis open una lista de sus asuntos con un equipo de vitis open o cuando vitis open LaTeX el libro de Stolyarov sobre el sistema de diseño LaTeX con un equipo de vitis open LaTeX , es moralmente difícil usar el sistema de archivos "anticuado".


Sobre esta base, surgen una serie de ideas. Por ejemplo, puede hacer una radio automática que incluya música temática de acuerdo con el clima actual, las vacaciones, el día de la semana, la hora del día o el año. Todavía cerca del tema hay un reproductor de música que conoce las categorías y puede reproducir música por expresión con operaciones en categorías como en sets. Es útil hacer un demonio que haga un seguimiento del directorio de descargas y ofrezca categorizar nuevos archivos. Bueno, por supuesto, deberías hacer un administrador de archivos semántico gráfico normal. Una vez incluso hice un servicio web para la empresa para compartir archivos, pero no fue una prioridad y se volvió irrelevante, aunque alcanzó un alto nivel de rendimiento. (Debido a los grandes cambios en la vitis misma, ya no se puede usar).


aquí hay una pequeña demostración


Conclusión


Vitis no es el primer intento de cambiar radicalmente el estilo de trabajar con datos, pero considero importante implementar mis ideas y poner la implementación en el dominio público bajo la licencia GNU GPL. Por conveniencia, se ha creado un paquete de deb para x86-64, debería funcionar en todas las distribuciones modernas de Debian. En ARM, hubo dificultades menores (mientras que todos los demás programas relacionados con vitis funcionan bien), pero en el futuro, también se creará un paquete de trabajo para esta plataforma (armhf). Hasta ahora he dejado de crear paquetes RPM debido a problemas en Fedora 30 y la dificultad de rociar en muchas distribuciones RPM, pero más tarde, de todos modos, se harán paquetes para al menos un par de ellos. Mientras tanto, 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.


Enlace al repositorio del proyecto

Source: https://habr.com/ru/post/457328/


All Articles