sistema de archivos personalizado con elegante comportamiento de finalización de readdir o bash

sistema de archivos personalizado con elegante comportamiento de finalización de readdir o bash

De acuerdo. Después de intentar formular esta pregunta un par de veces, resulta que será larga. Cualquiera:

Considere esta estructura de archivos:

photos/ 
  ants/ 
    pic1.jpg
  animals/ 
    dog.png
  profile_pic.jpg

si lo haces

cd photos
ls

usted obtiene

ants/    animals/    profile_pic.jpg

Sin embargo, dado que los directorios vacaciones y animales sólo contienen un archivo cada uno, podría decirse que podría ser más útil obtener

ants/pic1.jpg    ani../dog.png    profile_pic.jpg

directamente, en lugar de tener que visitar cada uno de los animales y vacacionar. Sin embargo, al completar la pestaña, como en el cd a, querrás sugerencias de los directorios.

Entonces sé que la finalización de bash se maneja mediante el script /etc/bash_completion (no quiero ir allí) y la biblioteca readline, pero esto realmente no afecta a ls y ciertamente no ayuda si desea extender la funcionalidad al archivo. gerentes como un nautilo. Por lo tanto, esperaba que algo de esto pudiera solucionarse utilizando un sistema de archivos personalizado sobre fusible. Una investigación inicial basada eneste tutorialSin embargo, fue algo deprimente, ya que el sistema de archivos fusionado parece no diferenciar de ninguna manera entre mis diferentes casos de uso (readdir, opendir, releaseir cada vez).

Para formular una pregunta: ¿De qué manera se podría abordar una funcionalidad similar, si es posible incluso sin una revisión importante del kernel? ¿Dónde debo buscar más información?

¡Gracias por tu tiempo!

EDITAR: Para aclarar, bash es un ejemplo útil, pero al final quiero que esto sea lo mismo a través de nautilus y cualquier otro programa que acceda a los archivos, y de todos modos escribiré un sistema de archivos para otros problemas.

Respuesta1

La forma más sencilla de lograr esto sería escribir un script bash para que lo haga por usted. Estoy bastante seguro de que no querrás codificar esto en el Kernel o el Sistema de archivos :)

Una lógica como esta debería funcionar:

Descender a directorios... Compruebe si un archivo... imprime carpeta/archivo... de lo contrario, imprime la carpeta superior

Respuesta2

Desafortunadamente, no puedo publicar un comentario, así que tengo que escribir una "respuesta" (todavía no entiendo esta decisión, pero basta de desvaríos). Dado que ya descartó la bashopción y sugirió una FUSEsolución, me gustaría brindarle un par de ideas "más o menos viables" mientras implementa su mp3fs:

  • Mejorando struct statcon un nuevo tipo, digamos st_nfiles. Cada vez que registres create()/symlink()/hardlink()un archivo, estarás actualizando esta entrada en las FUSEoperaciones respectivas. Averiguar si solo hay una entrada en el directorio referido será simplemente una búsqueda y comparación (struct stat) dirp->st_nfilescon 1. Necesitaría LD_PRELOADuna biblioteca en su espacio de usuario que secuestra y extiende las printfllamadas necesarias para generar los statresultados con este cambio.

  • Mal usoel existente (struct stat) dirp->st_nlinken su FUSEcódigo de operaciones de getattr(). El inconveniente podrían ser problemas con las herramientas que dependen de st_nlink; si no recuerdo mal, findes uno de ellos. Esto también necesita una LD_PRELOADbiblioteca global para manipular la salida.

  • Análisis sobre la marchaen el FUSEcódigo de operaciones de getattr(), similar a lo que haría en el espacio de usuario puro.EsteEl fragmento de código debería darte una idea.

No estoy seguro de si esto es lo que querías. Ojalá pudiera haber agregado esto como un comentario, en lugar de una respuesta a medias. Tal vez desee eliminar la bashetiqueta de esta pregunta, ya que indicó que esto no es adecuado para usted, ya que desea que herramientas como nautilusse comporten de la misma manera.

información relacionada