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 bash
opción y sugirió una FUSE
solución, me gustaría brindarle un par de ideas "más o menos viables" mientras implementa su mp3fs
:
Mejorando
struct stat
con un nuevo tipo, digamosst_nfiles
. Cada vez que registrescreate()/symlink()/hardlink()
un archivo, estarás actualizando esta entrada en lasFUSE
operaciones respectivas. Averiguar si solo hay una entrada en el directorio referido será simplemente una búsqueda y comparación(struct stat) dirp->st_nfiles
con 1. NecesitaríaLD_PRELOAD
una biblioteca en su espacio de usuario que secuestra y extiende lasprintf
llamadas necesarias para generar losstat
resultados con este cambio.Mal usoel existente
(struct stat) dirp->st_nlink
en suFUSE
código de operaciones degetattr()
. El inconveniente podrían ser problemas con las herramientas que dependen dest_nlink
; si no recuerdo mal,find
es uno de ellos. Esto también necesita unaLD_PRELOAD
biblioteca global para manipular la salida.Análisis sobre la marchaen el
FUSE
código de operaciones degetattr()
, 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 bash
etiqueta de esta pregunta, ya que indicó que esto no es adecuado para usted, ya que desea que herramientas como nautilus
se comporten de la misma manera.