Categorías en lugar de directorios, o el Sistema de archivos semánticos para Linux

La clasificación de datos en sí misma es un tema de investigación interesante. Me encanta recopilar la información que parece necesaria y siempre he tratado de crear jerarquías de directorios lógicas para mis archivos, y un día en un sueño vi un programa hermoso y conveniente para asignar etiquetas a archivos y decidí que no podía vivir. así por más tiempo.

El problema de los sistemas de archivos jerárquicos

Los usuarios a menudo se enfrentan al problema de elegir dónde guardar el siguiente archivo nuevo y al problema de encontrar sus propios archivos (a veces los nombres de los archivos no están destinados a ser recordados por una persona).

Una salida a esta situación pueden ser los sistemas de archivos semánticos, que suelen ser un complemento del sistema de archivos tradicional. Los directorios que contienen se reemplazan por atributos semánticos, también llamados etiquetas, categorías y metadatos. Usaré el término “categoría” más a menudo, porque... En el contexto de los sistemas de archivos, la palabra "etiqueta" a veces resulta un poco extraña, especialmente cuando aparecen "subetiquetas" y "alias de etiquetas".

Asignar categorías a archivos elimina en gran medida el problema de almacenar y buscar un archivo: si recuerda (o adivina) al menos una de las categorías asignadas a un archivo, el archivo nunca desaparecerá de la vista.

Anteriormente, este tema se planteó más de una vez en Habré (tiempo, два, tres, cuatro etc.), aquí describo mi solución.

Camino a la realización

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

La idea original era, en primer lugar, crear 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.

Primer intento de crear vitis Terminó en nada, ya que se empezó a dedicar mucho tiempo al trabajo y a la universidad. El segundo intento ya fue algo exitoso: para mi tesis de maestría logré completar el proyecto planeado e incluso hacer un prototipo de la carcasa GTK. Pero esa versión resultó ser tan poco fiable e incómoda que hubo que repensar muchas cosas.

De hecho, yo mismo usé la tercera versión durante mucho tiempo, habiendo transferido varios miles de mis archivos a categorías. Esto también se vio facilitado en gran medida por la finalización de bash implementada. Pero aún persistían algunos problemas, como la falta de categorías automáticas y la capacidad de almacenar archivos con el mismo nombre, y el programa ya estaba doblegado por su propia complejidad. Así surgió la necesidad de resolver problemas complejos de desarrollo de software: escribir requisitos detallados, desarrollar un sistema de prueba funcional, estudiar instrucciones de empaquetado y mucho más. Ya he llegado a mi plan, para que esta humilde creación pueda ser presentada a la comunidad libre. La gestión de archivos específicos, como la gestión a través del concepto de categorías, plantea cuestiones y problemas inesperados, y al resolverlos vitis generó cinco proyectos más a su alrededor, algunos de los cuales se mencionarán en el artículo. Hasta ahora vitis No he comprado un shell gráfico, pero la conveniencia de usar categorías de archivos desde la línea de comando ya supera para mí cualquier ventaja de un administrador de archivos gráfico normal.

Ejemplos de uso

Comencemos de manera simple: cree una categoría:

vitis create Музыка

Agreguemos alguna 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" usando el subcomando "mostrar":

vitis show Музыка

Puedes reproducirlo usando el subcomando "abrir".

vitis open Музыка

Porque Si solo tenemos un archivo en la categoría "Música", solo se iniciará ese. Con el fin de abrir archivos con sus programas predeterminados, creé una utilidad separada vts-fs-abierto (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

Categorías en lugar de directorios, o el Sistema de archivos semánticos para Linux

Creemos más categorías y agreguemos archivos usando "asignar". Si los archivos se asignan a categorías que aún no existen, se le solicitará que los cree. 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 la probabilidad y estadística matemática.pdf”. Sabemos que este archivo ya está categorizado como "R" y por tanto podemos utilizar la ruta de categoría del sistema Vitis:

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

Afortunadamente, la finalización de bash lo hace fácil.

Veamos qué pasó, usando el indicador --categories para ver una lista de categorías para cada archivo:

vitis show R --categories

Categorías en lugar de directorios, o el Sistema de archivos semánticos para Linux

Tenga en cuenta que los archivos también se han categorizado automáticamente por formato, tipo (combina formatos) y extensión de archivo. Estas categorías se pueden desactivar si lo desea. Más adelante definitivamente localizaré sus nombres.

Agreguemos algo más a “Matemáticas” para variar:

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

Y ahora la cosa se pone interesante. En lugar de categorías, puede escribir expresiones con las operaciones de unión, intersección y resta, es decir, utilizar operaciones en conjuntos. Por ejemplo, la intersección de "Math" con "R" dará como resultado un archivo.

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

Restemos las referencias a la lengua “R” de “Matemáticas”:

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

Podemos combinar sin rumbo la música y el lenguaje R:

vitis show Музыка u: R

El indicador -n le permite "extraer" los archivos requeridos del resultado de la solicitud por números y/o rangos, por ejemplo, -n 3-7, o algo más complicado: -n 1,5,8-10,13. Suele ser útil con el subcomando abrir, que le permite abrir los archivos deseados de una lista.

Categorías en lugar de directorios, o el Sistema de archivos semánticos para Linux

Si bien nos estamos alejando del uso de una jerarquía de directorios convencional, a menudo resulta útil tener categorías anidadas. Creemos una subcategoría "Estadísticas" en la categoría "Matemáticas" y agreguemos esta categoría al archivo correspondiente:

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

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

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

Categorías en lugar de directorios, o el Sistema de archivos semánticos para Linux

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

Abordar la ruta completa puede ser un inconveniente, creemos un alias "global":

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

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

Categorías en lugar de directorios, o el Sistema de archivos semánticos para Linux

No sólo archivos normales

enlaces de internet

Para unificar el almacenamiento de cualquier información, sería útil, como mínimo, categorizar los enlaces a recursos de Internet. Y esto es posible:

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

Se creará un archivo en un lugar especial con el encabezado de la página HTML y la extensión .desktop. Este es el formato de acceso directo tradicional en GNU/Linux. Estos accesos directos se clasifican automáticamente como NetworkBookmarks.

Naturalmente, los atajos se crean para ser utilizados:

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

La ejecución del comando hace que el enlace recién guardado se abra en el navegador. Los accesos directos categorizados a fuentes de Internet pueden servir como reemplazo de los marcadores del navegador.

Fragmentos de archivos

También es útil tener categorías para partes individuales de archivos. No es una mala petición, ¿eh? Pero la implementación actual hasta ahora sólo afecta a archivos de texto plano, archivos de audio y vídeo. Digamos que necesitas marcar cierta parte de un concierto o un momento divertido en una película, luego, cuando uses asignar, puedes usar las banderas -fragname, -start, -finish. Guardemos el protector de pantalla de "DuckTales":

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

vitis open Заставки

En realidad, no se produce ningún corte de archivo; en su lugar, se crea un archivo de puntero al 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 que creé especialmente para estos fines: mediafragmenter y fragplayer. El primero crea, el segundo abre. En el caso de grabaciones de audio y vídeo, el archivo multimedia se lanza desde una determinada posición a otra mediante el reproductor VLC, por lo que también debe estar en el sistema. Al principio quería hacer esto basado en mplayer, pero por alguna razón estaba muy torcido con el posicionamiento en el momento adecuado.
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 (ya que –start no se especificó al crear) hasta el 59 segunda marca, después de la cual VLC se cierra.

Otro ejemplo es cuando decidimos categorizar una única actuación en un concierto de un artista famoso:

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

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

Al abrirlo, el archivo se incluirá en la posición deseada y se cerrará al cabo de cuatro minutos y medio.

Cómo funciona todo + características adicionales

Almacenamiento de categorías

Al comenzar a pensar en organizar un sistema de archivos semántico, me vinieron a la mente tres formas: mediante el almacenamiento de 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 lado, el usuario tiene la oportunidad de consultar las categorías directamente desde el sistema de archivos (y esto es conveniente e importante). Al inicio del uso vitis El directorio “Vitis” y el archivo de configuración “.config/vitis/vitis.conf” se crean en el directorio de inicio del usuario. Los directorios correspondientes a las categorías se crean en ~/Vitis, y en estos directorios de categorías se crean enlaces simbólicos a los archivos originales. Los alias de categorías también son sólo enlaces a ellas. Por supuesto, la presencia del directorio "Vitis" en el directorio de inicio puede no ser adecuada para algunas personas. Podemos cambiar a cualquier otra ubicación:

vitis service set path /mnt/MyFavoriteDisk/Vitis/

En cierto punto, queda claro que no tiene mucho sentido categorizar archivos dispersos en diferentes lugares, ya que su ubicación puede cambiar. Por lo tanto, para empezar, creé un directorio para mí, donde estúpidamente descarté todo y le di todas las categorías. Entonces decidí que sería bueno formalizar este momento a nivel de programa. Así surgió el concepto de “espacio de archivos”. Al inicio del uso vitis No estaría de más configurar inmediatamente dicha ubicación (todos los archivos que necesitamos se almacenarán allí) y habilitar el guardado automático:

vitis service add filespace /mnt/MyFavoriteDisk/Filespace/

vitis service set autosave yes

Sin autoguardado, cuando se utiliza el subcomando "asignar", se 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 resultar útil cuando hay muchos archivos y están almacenados en diferentes medios. No consideraré esta posibilidad aquí; los detalles se pueden encontrar en la ayuda del programa.

Migración del sistema de archivos semántico

De todos modos, en teoría, el directorio de Vitis y los espacios de archivos a veces pueden moverse de un lugar a otro. Para que funcione, creé una utilidad separada. editor de enlaces, que puede editar enlaces de forma masiva, 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 -R

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

Categorías automáticas

Si ejecuta el comando vitis service get autocategorization, puedes ver que de forma predeterminada, las categorías automáticas se asignan 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 desde EPUB 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 de la definición de formatos de archivos es un tema interesante de investigación y merece un artículo aparte. Por ahora puedo decir que quizás no le he brindado un verdadero reconocimiento a todos los formatos del mundo, pero en general ya está funcionando bien. Es cierto que EPUB ahora define el formato como ZIP (en general, esto está justificado, pero en la práctica no debe considerarse un comportamiento normal). Por el momento, considere esta característica experimental e informe cualquier error. En situaciones extrañas, siempre puedes utilizar categorías de extensión de archivo, por ejemplo, Extensión/epub.

Si están habilitadas las autocategorías por formato, también se habilitan las autocategorías que agrupan 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 abarcarlo todo a la vez. Déjame mencionar brevemente qué más puedes hacer:

  • las categorías se pueden eliminar y eliminar de los archivos;
  • los resultados de las consultas de expresión se pueden copiar al directorio especificado;
  • 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, habilitar la visualización de archivos ocultos, etc.;
  • Cuando guarda enlaces a fuentes de Internet, también puede guardar copias locales de páginas HTML.

Los detalles completos se pueden encontrar en la ayuda del usuario.

Perspectivas

Los escépticos suelen decir que “nadie pondrá estas etiquetas por sí mismo”. Usando mi propio ejemplo, puedo demostrar lo contrario: ya categoricé más de seis mil archivos, creé más de mil categorías y alias, y valió la pena. Cuando un equipo vitis open План abre tu lista de tareas pendientes o cuando con un comando vitis open LaTeX Cuando abres el libro de Stolyarov sobre el sistema de diseño LaTeX, ya resulta moralmente difícil utilizar el sistema de archivos "a la antigua usanza".

Sobre esta base surgen una serie de ideas. Por ejemplo, puedes hacer una radio automática que encienda música temática según el clima actual, feriado, día de la semana, hora del día o año. Aún más cerca del tema está 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 conjuntos. Es útil crear un demonio que supervise el directorio "Descargas" y ofrezca categorizar nuevos archivos. Y, por supuesto, deberíamos crear un administrador de archivos semántico gráfico normal. Una vez incluso creé un servicio web para la empresa para el uso colectivo de archivos, pero no era una prioridad y se volvió irrelevante, aunque logró un alto nivel de rendimiento. (Debido a cambios importantes en el vitis, ya no se puede utilizar).

aquí hay una pequeña demostración

Categorías en lugar de directorios, o el Sistema de archivos semánticos para Linux

Conclusión

Vitis No es el primer intento de cambiar radicalmente el estilo de trabajar con datos, pero consideré importante implementar mis ideas y hacer que la implementación esté disponible públicamente bajo la licencia GNU GPL. Para mayor comodidad, se ha creado un paquete deb para x86-64; debería funcionar en todas las distribuciones Debian modernas. Hubo dificultades menores en ARM (mientras que todos los demás programas relacionados con vitis, funciona bien), pero en el futuro se compilará un paquete funcional para esta plataforma (armhf). Dejé de crear paquetes RPM por ahora debido a problemas en Fedora 30 y la dificultad de extenderse a muchas distribuciones RPM, pero aún se crearán paquetes posteriores para al menos un par de ellos. Mientras tanto puedes 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 de proyectos

Fuente: habr.com

Añadir un comentario