sistema de arquivos customizado com comportamento sofisticado readdir ou bash completion

3

Ok. Depois de tentar formular essa questão algumas vezes, verifica-se que esta será longa. Anywho:

Considere esta estrutura de arquivos:

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

se você fizer

cd photos
ls

você recebe

ants/    animals/    profile_pic.jpg

No entanto, como os diretórios vacation e animals contêm apenas um arquivo cada, pode ser mais útil obter

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

diretamente, ao contrário de ter que visitar cada um dos animais e férias. Na conclusão da tabulação, no entanto, como no cd a, você desejaria sugestões dos diretórios.

Então eu sei que a conclusão do bash é tratada pelo script / etc / bash_completion (não quero ir lá) e pela biblioteca readline, mas isso não afeta realmente o ls e certamente não ajuda se você quiser estender funcionalidade para gerenciadores de arquivos como um nautilus. Portanto, eu esperava que algumas dessas coisas pudessem ser resolvidas usando um sistema de arquivos personalizado em vez de um fusível. Uma investigação inicial baseada em este tutorial foi um pouco deprimente, como o sistema de arquivos de fusíveis parece de maneira alguma diferencie entre meus diferentes casos de uso (readdir, opendir, releasedir toda vez).

Para formular uma pergunta: De que maneira uma funcionalidade semelhante poderia ser abordada, se é possível mesmo 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 eu quero que isso seja o mesmo através do nautilus e todos os outros programas acessando os arquivos, e eu vou escrever um sistema de arquivos de qualquer maneira para outros problemas.

    
por fickludd 09.11.2012 / 20:42

2 respostas

1

A maneira mais fácil de conseguir isso seria escrever um script bash para fazer isso para você. Tenho certeza que você não vai querer codificar isso no kernel ou no sistema de arquivos:)

Lógica como essa deve funcionar:

Descida em diretórios ... Verifique se um arquivo ... imprime pasta / arquivo ... senão imprime a pasta superior

    
por 09.11.2012 / 20:58
1
Infelizmente, eu não posso postar um comentário, então eu tenho que escrever uma "resposta" (eu ainda não entendo essa decisão, mas o suficiente da reclamação). Como você já descartou a opção bash e sugeriu uma solução FUSE , gostaria de sugerir algumas idéias "mais ou menos viáveis" ao implementar seu mp3fs :

  • Aprimorando struct stat com um novo tipo, digamos st_nfiles . Cada vez que você create()/symlink()/hardlink() a um arquivo, você estará atualizando esta entrada nas respectivas operações FUSE . Descobrir se há apenas uma entrada no diretório referido será meramente uma pesquisa e comparação de (struct stat) dirp->st_nfiles com 1. Você precisaria de LD_PRELOAD uma biblioteca para seu espaço de usuário que intercepta e estende o necessário printf chamadas para gerar os resultados stat com essa alteração.

  • Uso indevido do (struct stat) dirp->st_nlink existente no seu código de operações FUSE de getattr() . A desvantagem pode ser problemas com ferramentas que dependem de st_nlink ; se bem me lembro, find é um deles. Isso também precisa de uma biblioteca global LD_PRELOAD para mexer com a saída.

  • Análise rápida no código de operações FUSE de getattr() , semelhante ao que você faria no espaço de usuário puro. Este snippet de código deve lhe dar a ideia.

Não tenho certeza se isso é o que você queria. Eu gostaria de ter acrescentado isso como um comentário, em vez de uma resposta semicortada. Talvez você queira remover a tag bash dessa pergunta, já que indicou que isso não é adequado para você, pois você deseja que ferramentas como nautilus se comportem da mesma maneira.

    
por 11.11.2012 / 14:35