OK. Depois de tentar formular esta questão algumas vezes, verifica-se que esta será longa. Qualquer um:
Considere esta estrutura de arquivo:
photos/
ants/
pic1.jpg
animals/
dog.png
profile_pic.jpg
se você fizer
cd photos
ls
você consegue
ants/ animals/ profile_pic.jpg
No entanto, como os diretórios férias e animais contêm apenas um arquivo cada, poderia ser mais útil obter
ants/pic1.jpg ani../dog.png profile_pic.jpg
diretamente, em vez de ter que visitar cada um dos animais e passar férias. No entanto, na conclusão da guia, como em cd a, você desejaria sugestões dos diretórios.
Então, eu sei que a conclusão do bash é controlada pelo script /etc/bash_completion (não quero ir lá) e pela biblioteca readline, mas isso realmente não afeta ls e certamente não ajuda se você deseja estender a funcionalidade para arquivo gerentes como um nautilus. Portanto, eu esperava que parte disso pudesse ser resolvido usando um sistema de arquivos personalizado sobre fusível. Uma investigação inicial baseada emeste tutorialfoi um tanto deprimente, já que o sistema de arquivos fuse parece não diferenciar de forma alguma entre meus diferentes casos de uso (readdir, opendir, liberado sempre).
Para formular uma pergunta: De que forma uma funcionalidade semelhante poderia ser abordada, se é mesmo possível sem uma grande revisão no kernel? Onde devo procurar mais informações?
Obrigado pelo seu tempo!
EDIT: Para esclarecer, bash é um exemplo útil, mas no final quero que seja o mesmo através do nautilus e de todos os outros programas que acessam os arquivos, e vou escrever um sistema de arquivos de qualquer maneira para outros problemas.
Responder1
A maneira mais fácil de fazer isso seria escrever um script bash para fazer isso para você. Tenho quase certeza de que você não vai querer codificar isso no Kernel ou no sistema de arquivos :)
Lógica como esta deve funcionar:
Desça até os diretórios... Verifique se um arquivo... imprime pasta/arquivo... senão imprime a pasta superior
Responder2
Infelizmente, não posso postar um comentário, então tenho que escrever uma "resposta" (ainda não entendi essa decisão, mas chega de reclamações). Como você já descartou a bash
opção e sugeriu uma FUSE
solução, gostaria de lhe dar algumas ideias "mais ou menos viáveis" enquanto você implementa seu mp3fs
:
Melhorando
struct stat
com um novo tipo, digamosst_nfiles
. Cada vez que você criarcreate()/symlink()/hardlink()
um arquivo, você estará atualizando esta entrada nas respectivasFUSE
operações. Descobrir se há apenas uma entrada no diretório referido será apenas uma pesquisa e comparação(struct stat) dirp->st_nfiles
com 1. Você precisaria deLD_PRELOAD
uma biblioteca para seu espaço de usuário que sequestrasse e estendesse asprintf
chamadas necessárias para gerar osstat
resultados com essa alteração.Uso indevidoo existente
(struct stat) dirp->st_nlink
em seuFUSE
código de operações degetattr()
. A desvantagem pode ser problemas com ferramentas que dependem dest_nlink
; se bem me lembro,find
é um deles. Isso também precisa de uma biblioteca globalLD_PRELOAD
para mexer na saída.Análise instantâneano
FUSE
código de operações degetattr()
, semelhante ao que você faria no espaço do usuário puro.Esseo trecho de código deve lhe dar uma ideia.
Não tenho certeza se isso é o que você queria. Eu gostaria de ter adicionado isso como um comentário, em vez de uma resposta incompleta. Talvez você queira remover a bash
tag desta pergunta, já que indicou que isso não é adequado para você, já que deseja que ferramentas nautilus
se comportem da mesma maneira.