sistema de arquivos personalizado com comportamento de conclusão readdir ou bash sofisticado

sistema de arquivos personalizado com comportamento de conclusão readdir ou bash sofisticado

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 bashopção e sugeriu uma FUSEsolução, gostaria de lhe dar algumas ideias "mais ou menos viáveis" enquanto você implementa seu mp3fs:

  • Melhorando struct statcom um novo tipo, digamos st_nfiles. Cada vez que você criar create()/symlink()/hardlink()um arquivo, você estará atualizando esta entrada nas respectivas FUSEoperações. Descobrir se há apenas uma entrada no diretório referido será apenas uma pesquisa e comparação (struct stat) dirp->st_nfilescom 1. Você precisaria de LD_PRELOADuma biblioteca para seu espaço de usuário que sequestrasse e estendesse as printfchamadas necessárias para gerar os statresultados com essa alteração.

  • Uso indevidoo existente (struct stat) dirp->st_nlinkem seu FUSEcódigo de operações 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_PRELOADpara mexer na saída.

  • Análise instantâneano FUSEcódigo de operações de getattr(), 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 bashtag desta pergunta, já que indicou que isso não é adequado para você, já que deseja que ferramentas nautilusse comportem da mesma maneira.

informação relacionada