Categorias em vez de diretórios ou o sistema de arquivos semântico para Linux

A classificação dos dados é em si um tópico interessante para a pesquisa. Gosto de coletar informações que parecem necessárias e sempre tentei criar hierarquias lógicas de diretórios para meus arquivos e, uma vez em um sonho, vi um programa bonito e conveniente para atribuir tags a arquivos e decidi que era impossível viver assim.


O problema dos sistemas de arquivos hierárquicos


Os usuários geralmente encontram o problema de escolher onde salvar o próximo novo arquivo e o problema de encontrar seus próprios arquivos (às vezes, os nomes dos arquivos não são destinados ao armazenamento humano).


A saída dessa situação pode ser sistemas de arquivos semânticos, que geralmente são um complemento para um sistema de arquivos tradicional. Os diretórios neles são substituídos por atributos semânticos, também chamados de tags, categorias, metadados. Usarei o termo "categoria" com mais frequência, pois no contexto de sistemas de arquivos, a palavra “tag” às vezes é estranha, especialmente quando “subtags” e “aliases de tags” aparecem.


A atribuição de categorias a arquivos elimina amplamente os problemas de armazenamento e pesquisa de arquivos: se você lembrar (ou adivinhar) pelo menos uma das categorias atribuídas ao arquivo, o arquivo nunca será perdido de vista.


Anteriormente, em Habré, esse tópico foi levantado mais de uma vez ( um , dois , três , quatro etc.), aqui descrevo minha decisão.


Caminho de implementação


Imediatamente após o sonho mencionado, descrevi em um caderno a interface de comando que fornece o trabalho necessário com as categorias. Decidi que, em uma semana ou duas, você pode escrever um protótipo usando Python ou Bash e precisará trabalhar na criação de um shell gráfico no Qt ou GTK. A realidade, como sempre, acabou sendo muito mais grave, e o desenvolvimento se arrastou.


A idéia inicial era criar primeiro um programa com uma interface de linha de comando conveniente e concisa que criaria, excluir categorias, atribuir categorias a arquivos e remover categorias de arquivos. Liguei para o programa vitis .


A primeira tentativa de criar vitis terminou em nada, já que muito tempo começou a ir para o trabalho e para a faculdade. A segunda tentativa já era algo: pela tese de mestrado, conseguimos concluir o projeto planejado e até fazer um protótipo do shell GTK. Mas essa versão acabou sendo tão pouco confiável e desconfortável que tive que repensar muito.


Eu já usei a terceira versão há muito tempo, traduzindo vários milhares de meus arquivos em categorias. Isso, entre outras coisas, foi bastante facilitado pela conclusão do bash implementado. Mas alguns problemas, como a falta de categorias automáticas e a capacidade de armazenar arquivos com o mesmo nome, ainda permaneciam, e o programa já estava dobrado sob sua própria complexidade. Então, cheguei à necessidade de resolver os problemas do desenvolvimento de software complexo: escrever requisitos detalhados, desenvolver um sistema de teste funcional, estudar as instruções de embalagem e muito mais. Agora cheguei a um plano, para que esta criação modesta possa ser apresentada à comunidade livre. Esse gerenciamento de arquivos específico, como o gerenciamento através do conceito de categorias, aborda questões e problemas inesperados e, ao resolvê-los, o vitis gerou mais cinco projetos em torno de si, alguns dos quais serão mencionados no artigo. Até agora, o vitis não adquiriu um shell gráfico, mas a conveniência de usar categorias de arquivos na linha de comando já cobre para mim quaisquer vantagens do gerenciador de arquivos gráficos usual.


Exemplos de uso


Vamos começar com um simples - crie uma categoria:


vitis create  

Vamos adicionar uma composição a ele como um exemplo:


 vitis assign  -f "The Ink Spots - I Don't Want To Set The World On Fire.mp3" 

Você pode visualizar o conteúdo da categoria Música pelo comando show:


 vitis show  

Você pode reproduzi-lo usando o subcomando "open"


 vitis open  

Porque temos apenas um arquivo na categoria "Música" e somente ele será iniciado. Para a finalidade de abrir arquivos com seus programas, por padrão, criei um utilitário separado vts-fs-open (ferramentas padrão como xdg-open ou mimeopen não me agradaram por várias razões; mas, se houver, nas configurações, você pode especificar outro utilitário para a abertura universal de arquivos) . Esse utilitário funciona bem em diferentes distribuições com diferentes ambientes de trabalho, portanto, recomendo instalá-lo junto com o vitis.


Você também pode especificar diretamente o programa para abrir arquivos:


 vitis open  --app qmmp 


Vamos criar mais categorias e adicionar arquivos usando "assign". Se os arquivos forem atribuídos a categorias que ainda não existem, uma solicitação será emitida para sua criação. Uma solicitação desnecessária pode ser evitada usando o sinalizador --yes.


 vitis assign  R -f "  R.pdf" "  R:    .pdf" --yes 

Agora queremos adicionar a categoria "Matemática" ao arquivo "Pacote estatístico R: teoria das probabilidades e estatística .pdf". Sabemos que este arquivo já possui a categoria "R" e, portanto, podemos usar o caminho categórico do sistema Vitis:


 vitis assign  -v "R/  R:    .pdf" 

Felizmente, o preenchimento automático do bash tornará isso fácil.


Veja o que aconteceu usando o sinalizador --categories para ver uma lista de categorias para cada arquivo:


 vitis show R --categories 


Observe que os arquivos também receberam categorias automáticas por formato, tipo (combina formatos) e extensão de arquivo. Essas categorias estão opcionalmente desativadas. Mais tarde eu definitivamente farei a localização de seus nomes.


Vamos adicionar outra coisa ao "Matemática" para variar:


 vitis assign  -f "  - 1984.pdf" ___1927.djvu 

E agora a diversão começa. Em vez de categorias, você pode escrever expressões com operações de união, interseção e subtração, ou seja, usar operações em conjuntos. Por exemplo, a interseção de "Matemática" com "R" resultará em um arquivo.


 vitis show R i:  

Subtrair das referências "Matemática" para a linguagem "R":


 vitis show  \\ R # vitis show  c: R 

Podemos combinar perfeitamente a música e a linguagem R:


 vitis show  u: R 

O sinalizador -n permite "retirar" os arquivos necessários do resultado da consulta por números e / ou intervalos, por exemplo, -n 3-7 , ou mais complicado: -n 1,5,8-10,13 . Geralmente é útil com o subcomando aberto, que permite abrir os arquivos necessários da lista.



Embora estejamos deixando de usar a hierarquia de diretórios usual, geralmente é útil ter categorias aninhadas. Crie uma subcategoria "Estatísticas" para a categoria "Matemática" e adicione esta categoria ao arquivo apropriado:


 vitis create / vitis assign / -v "R/  R.pdf" vitis show  --categories 


Podemos ver que este arquivo agora tem a categoria "Matemática / Estatística" em vez de "Matemática" (links extras são rastreados).


Acessar o caminho completo pode ser inconveniente, crie um alias "global":


 vitis assign / -a  vitis show  


Não apenas arquivos regulares


Links da Internet


Para unificar o armazenamento de qualquer informação, seria útil pelo menos categorizar links para recursos da Internet. E é possível:


 vitis assign   -i https://habr.com/ru/company/sfe_ru/blog/437304/ --yes 

Em um local especial, será criado um arquivo com o cabeçalho da página HTML e com a extensão .desktop. Este é o formato de atalho tradicional no GNU / Linux. Esses atalhos recebem a categoria automática NetworkBookmarks.


Naturalmente, os atalhos são criados para usá-los:


 vitis open  

A execução do comando leva à abertura do link recém salvo no navegador. Atalhos categorizados para fontes da Internet podem substituir os favoritos do navegador.


Fragmentos de arquivo


Também é útil ter categorias para fragmentos de arquivo individuais. Bela oferta, hein? Mas a implementação atual até agora afeta apenas arquivos de texto comuns, arquivos de áudio e vídeo. Digamos que você precise anotar uma parte específica de um concerto ou um momento engraçado no filme; ao usar o atributo, você pode usar as bandeiras --fragname, --start, --finish. Salve o protetor de tela de Duck Tales:


 vitis assign -c  -f Duck_Tales/s01s01.avi --finish 00:00:59 --fragname "Duck Tales intro" vitis open  

Na verdade, nenhum recorte de arquivos ocorre; em vez disso, é criado um ponteiro de arquivo para um fragmento, que descreve o tipo de arquivo, o caminho para o arquivo, o início e o final do fragmento. A criação e abertura de ponteiros para fragmentos é delegada em utilitários especialmente criados por mim para esses fins - são o mediafragmenter e o fragplayer. O primeiro cria, o segundo se abre. No caso de gravações de áudio e vídeo, o lançamento de um arquivo de mídia de uma determinada posição para uma determinada posição ocorre usando o VLC player, portanto, ele também deve estar no sistema. No começo, eu queria fazer isso com base no mplayer, mas por algum motivo, estava muito torto com o posicionamento no momento certo.
Em nosso exemplo, o arquivo "Duck Tales intro.fragpointer" é criado (é colocado em um local especial) e, em seguida, um fragmento é reproduzido desde o início do arquivo (porque --start não foi especificado ao criar) até a marca em 59 segundos, após o qual o VLC fecha.


Outro exemplo - decidimos categorizar uma performance separada em um show de algum artista famoso:


 vitis assign  "  " -f \ c\ -\ \ \ -\ \ \ .mp4 --fragname "  " --start 00:32:18 --finish 00:36:51 vitis open "  " 

Quando você abre o arquivo, ele será incluído na posição desejada e após quatro minutos e meio, ele será fechado.


Como tudo funciona + recursos adicionais


Categoria Armazenamento


No começo do pensamento sobre a organização do sistema de arquivos semântico, criei três maneiras: armazenando links simbólicos, através de um banco de dados, através de uma descrição em XML. O primeiro método venceu porque por um lado, é fácil de implementar e, por outro, o usuário tem a oportunidade de analisar categorias diretamente do sistema de arquivos (e isso é conveniente e importante). No início do uso do vitis , o diretório "Vitis" e o arquivo de configuração ".config / vitis / vitis.conf" são criados no diretório inicial do usuário. ~ / Vitis cria diretórios correspondentes a categorias, e nesses diretórios de categoria cria links simbólicos para os arquivos originais. Os aliases de categoria também são apenas links para eles. Obviamente, a presença do diretório "Vitis" no diretório inicial pode não ser adequada para alguém. Podemos mudar para qualquer outro lugar:


 vitis service set path /mnt/MyFavoriteDisk/Vitis/ 

A certa altura, fica claro que os arquivos espalhados em locais diferentes não são significativos para categorizar, pois sua localização pode mudar. Portanto, para começar, criei um diretório para mim, onde estupidamente joguei tudo e dei categorias a tudo. Então ele decidiu que seria legal formalizar esse momento no nível do software. Então, o conceito de "espaço no arquivo" apareceu. No início do uso do vitis , não faria mal configurar imediatamente um local (todos os arquivos necessários serão armazenados lá) e ativar o salvamento automático:


 vitis service add filespace /mnt/MyFavoriteDisk/Filespace/ vitis service set autosave yes 

Sem o salvamento automático, o uso do subcomando "assign" exigirá o sinalizador --save se você desejar salvar o arquivo adicionado no espaço no arquivo.


Além disso, você pode adicionar vários espaços no arquivo e alterar suas prioridades, o que pode ser útil quando houver muitos arquivos e eles estiverem armazenados em diferentes mídias. Aqui não considerarei essa possibilidade; detalhes podem ser encontrados na ajuda do programa.


Migração do sistema de arquivos semântico


De uma maneira ou de outra, o diretório Vitis e os espaços no arquivo às vezes podem, teoricamente, se mover de um lugar para outro. Para fazê-lo funcionar, criei um utilitário editor de links separado que pode editar links em massa, substituindo partes do caminho por outras:


 cp -r /mnt/MyFavoriteDisk/Vitis/ ~/Vitis link-editor -d ~/Vitis/ -f /mnt/MyFavoriteDisk/Vitis/ -r ~/Vitis/ -R cp -r /mnt/MyFavoriteDisk/Filespace/ ~/MyFiles link-editor -d ~/Vitis/ -f /mnt/FlashDrive-256/Filespace/ -r ~/MyFiles -R 

No primeiro caso, depois que passamos do / mnt / MyFavoriteDisk / Vitis / para o diretório inicial, os links simbólicos associados aos aliases são editados. No segundo caso, após alterar a localização do espaço no arquivo, todos os links no Vitis mudam para novos, de acordo com a solicitação para substituir parte do caminho.


Categorias automáticas


Se você executar o vitis service get autocategorization , poderá ver que a configuração padrão das categorias automáticas é por formato (Formato e Tipo) e extensão de arquivo (Extensão).


Isso é útil quando, por exemplo, você precisa encontrar algo entre PDFs ou observar o que armazenou do MOBI e FB2, pode simplesmente executar a solicitação


 vitis show Format/MOBI u: Format/FB2 

Aconteceu que as ferramentas padrão do GNU / Linux, como arquivo ou tipo mimet, não se adequavam exatamente a mim, porque nem sempre determinam corretamente o formato; eu tive que fazer minha própria implementação com base em assinaturas e extensões de arquivo. Em geral, o tópico para determinar os formatos de arquivo é um tópico interessante para pesquisa e merece um artigo separado. Por enquanto, posso dizer que, talvez, não para todos os formatos do mundo, forneço reconhecimento verdadeiro, mas, em geral, está funcionando muito bem no momento. É verdade que o formato EPUB agora é definido como ZIP (em geral, é justificado, mas na prática isso não deve ser considerado comportamento normal). Até agora, considere esse recurso experimental, relate erros. Em situações estranhas, você sempre pode usar categorias por extensão de arquivo, por exemplo, Extensão / epub.


Se categorias automáticas por formato forem incluídas, categorias automáticas também serão incluídas, combinando alguns formatos por tipo: "Arquivos", "Imagens", "Vídeo", "Áudio" e "Documentos". Nomes localizados também serão criados para essas subcategorias.


O que não é dito


vitis acabou por ser uma ferramenta muito multifacetada e é difícil cobrir tudo de uma vez. Mencione brevemente o que mais você pode fazer:


  • As categorias podem ser excluídas e removidas dos arquivos;
  • os resultados da consulta para expressões podem ser copiados para o diretório especificado;
  • arquivos podem ser executados como programas;
  • O comando show tem muitas opções, por exemplo, classificando por nome / data da alteração ou acesso / tamanho / extensão, mostrando propriedades e caminhos dos arquivos para os originais, ativando a exibição de arquivos ocultos, etc;
  • Quando você salva links para fontes da Internet, também pode salvar cópias locais de páginas HTML.

Todos os detalhes podem ser encontrados na ajuda do usuário.


Perspectivas


Muitas vezes, os céticos dizem que "ninguém vai colocar essas tags sozinho". Usando o meu exemplo, posso provar o contrário: já categorizei mais de seis mil arquivos, criei mais de mil categorias e aliases e valeu a pena. Quando você vitis open uma lista de assuntos com uma equipe do vitis open ou quando você vitis open LaTeX o livro de Stolyarov sobre o sistema de layout LaTeX com uma equipe vitis open LaTeX , é moralmente difícil usar o sistema de arquivos "antiquado".


Nesta base, surgem várias idéias. Por exemplo, você pode fazer um rádio automático que inclua música tema de acordo com o clima atual, feriado, dia da semana, hora do dia ou ano. Ainda próximo ao tópico está um tocador de música que conhece as categorias e pode tocar música por expressão, com operações nas categorias e nos sets. É útil criar um daemon que acompanhará o diretório Downloads e oferecerá a categorização de novos arquivos. Bem, é claro, você deve criar um gerenciador de arquivos semânticos gráficos normais. Certa vez, criei um serviço da Web para a empresa para compartilhamento de arquivos, mas não era uma prioridade e me tornei irrelevante, embora atingisse um alto nível de desempenho. (Devido às grandes mudanças no próprio vitis , ele já é inutilizável.)


aqui está uma pequena demonstração


Conclusão


O Vitis não é a primeira tentativa de mudar radicalmente o estilo de trabalhar com dados, mas considerei importante implementar minhas idéias e colocar a implementação em domínio público sob a licença GNU GPL. Por conveniência, um pacote deb para x86-64 foi criado, ele deve funcionar em todas as distribuições modernas do Debian. No ARM, houve pequenas dificuldades (embora todos os outros programas relacionados ao vitis funcionem bem), mas no futuro, um pacote de trabalho também será construído para esta plataforma (armhf). Até agora, parei de criar pacotes RPM devido a problemas no Fedora 30 e à dificuldade de pulverizar em muitas distribuições RPM, mas, mais tarde, os pacotes serão feitos para pelo menos alguns deles. Enquanto isso, você pode usar make && make install ou checkinstall .


Obrigado a todos pela atenção! Espero que este artigo e este projeto possam ser úteis.


Link para o repositório do projeto

Source: https://habr.com/ru/post/pt457328/


All Articles