Categorias em vez de diretórios, ou Sistema de Arquivos Semântico para Linux

A classificação de dados é, por si só, um tema interessante para pesquisa. Eu gosto de coletar informações que parecem necessárias e sempre tentei fazer hierarquias lógicas de diretórios para meus arquivos. Um dia, tive um sonho em que vi um programa belo e prático para atribuir tags a arquivos e decidi que não poderia continuar assim.

O problema dos sistemas de arquivos hierárquicos

Os usuários frequentemente enfrentam a dificuldade de escolher o local para salvar um novo arquivo e a questão de encontrar seus próprios arquivos (às vezes os nomes dos arquivos nem são feitos para serem lembrados por humanos).

Uma solução para isso pode ser sistemas de arquivos semânticos, que geralmente são uma camada sobre a tradicional estrutura de arquivos. Diretórios são substituídos por atributos semânticos, também chamados de tags, categorias ou metadados. Usarei mais frequentemente o termo 'categoria', pois no contexto de sistemas de arquivos, a palavra 'tag' pode parecer estranha, especialmente quando surgem 'subtags' e 'apelidos de tags'.

Atribuir categorias a arquivos elimina muito dos problemas de armazenamento e busca: se você lembra (ou suspeita) de pelo menos uma das categorias atribuídas ao arquivo, o arquivo nunca ficará fora de vista.

Este tema já foi levantado várias vezes no Habré (um, dois, três, quatro e outros), aqui descrevo minha solução.

Caminho para a implementação

Logo após o sonho mencionado, descrevi em um caderno uma interface de comando que proporcionaria o necessário para trabalhar com categorias. Na época, pensei que poderia escrever um protótipo em uma ou duas semanas, usando Python ou Bash, e depois seria necessário desenvolver uma interface gráfica em Qt ou GTK. A realidade, como sempre, foi muito mais difícil, e o desenvolvimento se prolongou.

A ideia original era, acima de tudo, criar um programa com uma interface de linha de comando conveniente e concisa, que seria capaz de criar, deletar categorias, atribuir categorias a arquivos e remover categorias de arquivos. Eu nomeei o programa vitis.

A primeira tentativa de criar vitis terminou sem resultados, já que muito tempo começou a ser dedicado ao trabalho e à faculdade. A segunda tentativa foi algo: consegui concluir o projeto planejado para a dissertação de mestrado e até fazer um protótipo da interface GTK. Mas essa versão acabou sendo tão instável e inconveniente que foi necessário repensar muitas coisas.

Na terceira versão, eu realmente a utilizei por um longo período, categorizando milhares dos meus arquivos. Isso foi bastante facilitado pela funcionalidade de autocompletar no bash. Mas alguns problemas, como a falta de categorias automáticas e a possibilidade de armazenar arquivos com nomes iguais, ainda persistiam, e o programa já estava sofrendo sob a própria complexidade. Assim, percebi a necessidade de resolver os desafios do desenvolvimento de software complexo: elaborar requisitos detalhados, desenvolver um sistema de testes funcionais, estudar instruções sobre empacotamento e muito mais. Agora, cheguei ao que desejava, e essa modesta criação pode ser apresentada à comunidade livre. A gestão de arquivos de uma forma tão específica, através do conceito de categorias, levanta questões e problemas inesperados, e a solução deles vitis gerou ao seu redor mais cinco projetos, alguns dos quais serão mencionados no artigo. Até hoje vitis não adquiri uma interface gráfica, mas a conveniência de utilizar categorias de arquivos via linha de comando já supera para mim quaisquer benefícios de um gerenciador de arquivos gráfico convencional.

Exemplos de uso

Vamos começar pelo básico — vamos criar uma categoria:

vitis create Música

Adicionemos um exemplo de alguma composição a ela:

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

Para ver o conteúdo da categoria 'Música', use o comando 'show':

vitis show Música

Para reproduzi-la, use o comando 'open'

vitis open Música

Como temos apenas um arquivo na categoria 'Música', somente ele será iniciado. Para abrir arquivos em seus programas padrão, criei um utilitário separado vts-fs-open (ferramentas padrão como xdg-open ou mimeopen não me satisfazem por uma série de razões; mas, se necessário, nas configurações você pode indicar outro utilitário para abrir arquivos de forma universal). Este utilitário funciona bem em diferentes distribuições com diferentes ambientes de desktop, por isso recomendo instalá-lo junto com o vitis.

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

vitis open Música --app qmmp

Categorias em vez de diretórios, ou Sistema de Arquivos Semântico para Linux

Vamos criar mais categorias e adicionar arquivos usando "assign". Se os arquivos forem atribuídos a categorias que ainda não existem, será feita uma solicitação para criá-las. Você pode evitar a solicitação extra se usar a flag --yes.

vitis assign Programação R -f "Introdução ao R.pdf" "Pacote Estatístico R: Teoria das Probabilidades e Estatística Matemática.pdf" --yes

Agora queremos adicionar a categoria "Matemática" ao arquivo "Pacote Estatístico R: Teoria das Probabilidades e Estatística Matemática.pdf". Sabemos que esse arquivo já tem a categoria "R" e, portanto, podemos usar o caminho da categoria do sistema Vitis:

vitis assign Matemática -v "R/Pacote Estatístico R: Teoria das Probabilidades e Estatística Matemática.pdf"

Felizmente, o autocompletar bash permitirá fazer isso facilmente.

Vamos verificar o que conseguimos, usando a flag --categories, para ver a lista de categorias de cada arquivo:

vitis show R --categories

Categorias em vez de diretórios, ou Sistema de Arquivos Semântico para Linux

Observe que os arquivos também foram atribuídos a categorias automáticas com base em formato, tipo (que agrupa formatos) e extensão de arquivo. Essas categorias podem ser desativadas, se desejado. Mais tarde, certamente farei a localização dos seus nomes.

Vamos adicionar algo mais à "Matemática" para diversificar:

vitis assign Matemática -f "Análise Matemática - 1984.pdf" Perelman_Matemática_Interativa_1927.djvu 

Agora a parte interessante. 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 da "Matemática" com "R" resultará em um único arquivo.

vitis show R i: Matemática

Subtrairemos das menções à linguagem "R" da "Matemática":

vitis show Matemática R #ou vitis show Matemática c: R

Podemos unir música e a linguagem R de forma aleatória:

vitis show Música u: R

A flag -n permite "extrair" dos resultados da consulta os arquivos desejados por números e/ou intervalos, por exemplo, -n 3-7, ou algo mais complicado: -n 1,5,8-10,13. Muitas vezes é útil usar o subcomando open, que permite abrir os arquivos desejados da lista.

Categorias em vez de diretórios, ou Sistema de Arquivos Semântico para Linux

Embora estejamos nos afastando do uso da hierarquia de diretórios comum, muitas vezes é útil ter categorias aninhadas. Vamos criar uma subcategoria "Estatística" na categoria "Matemática" e adicionar essa categoria ao arquivo correspondente:

vitis create Matemática/Estatística

vitis assign Matemática/Estatística -v "R/Introdução ao R.pdf"

vitis show Matemática --categories

Categorias em vez de diretórios, ou Sistema de Arquivos Semântico para Linux

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

Referir-se ao caminho completo pode ser inconveniente, vamos criar um pseudônimo "global":

vitis assign Matemática/Estatística -a Estatística

vitis show Estatística

Categorias em vez de diretórios, ou Sistema de Arquivos Semântico para Linux

Não apenas arquivos comuns

Links da Internet

Para uniformizar o armazenamento de qualquer informação, seria útil, no mínimo, categorizar links para recursos da Internet. E isso é possível:

vitis assign Habr Cor Anômala -i https://habr.com/ru/company/sfe_ru/blog/437304/ --yes

Um arquivo será criado em um local específico com o título da página HTML e a extensão .desktop. Este é o formato tradicional de atalho no GNU/Linux. Esses atalhos recebem automaticamente a categoria NetworkBookmarks.

Naturalmente, os atalhos são criados para serem usados:

vitis open Cor Anômala

A execução do comando leva à abertura no navegador do link recém-salvo. Atalhos categorizados para fontes da Internet podem servir como uma alternativa aos favoritos do navegador.

Fragmentos de arquivos

Também é útil ter categorias para fragmentos individuais de arquivos. Não é uma má ideia, certo? Mas a implementação atual abrange apenas arquivos de texto comuns, arquivos de áudio e vídeo. Digamos que você precise marcar um pedaço de algum concerto ou um momento engraçado em um filme; então, ao usar assign, você pode aproveitar as flags —fragname, —start, —finish. Vamos salvar a introdução de "DuckTales":

vitis assign vitis assign -c Introduções -f Duck_Tales/s01s01.avi --finish 00:00:59 --fragname "Introdução Duck Tales"

vitis open Introduções

Na realidade, nenhum corte de arquivos ocorre; ao invés disso, é criado um arquivo de ponteiro para o fragmento, no qual são descritos o tipo de arquivo, o caminho para o arquivo, o início e o fim do fragmento. A criação e abertura de ponteiros para fragmentos são delegadas a utilitários que eu desenvolvi especificamente para essas finalidades — são o mediafragmenter e o fragplayer. O primeiro cria, o segundo abre. No caso de gravações de áudio e vídeo, a execução do arquivo de mídia de uma determinada posição até uma outra particular ocorre por meio do reprodutor VLC, então ele também deve estar no sistema. Inicialmente, eu queria fazer isso com base no mplayer, mas lá, por algum motivo, a localização no momento certo estava muito confusa.
No nosso exemplo, cria-se o arquivo "Duck Tales intro.fragpointer" (que é colocado em um local específico), e depois é reproduzido um fragmento do início do arquivo (já que —start não foi especificado na criação) até a marca de 59 segundos, após o que VLC se fecha.

Outro exemplo é que decidimos categorizar uma apresentação específica em um show de algum artista famoso:

vitis assign Лепс "Спасите наши души" -f Григорий Лепc - Концерт Парус - песни Владимира Высоцкого.mp4 --fragname "Спасите наши души" --start 00:32:18 --finish 00:36:51

vitis open "Спасите наши души"

Ao abrir, o arquivo será incluído na posição certa e fechará em quatro minutos e meio.

Como tudo isso funciona + funcionalidades adicionais

Armazenamento de categorias

No início do planejamento da organização do sistema de arquivos semântico, pensei em três maneiras: através do armazenamento de links simbólicos, por meio de um banco de dados, através de uma descrição em XML. A primeira opção venceu, pois, por um lado, é simples de implementar e, por outro, o usuário pode visualizar as categorias diretamente do sistema de arquivos (o que é conveniente e importante). No início do uso vitis na pasta inicial do usuário, cria-se uma pasta "Vitis" e um arquivo de configuração ".config/vitis/vitis.conf". Em ~/Vitis, são criadas pastas correspondentes às categorias, e dentro dessas pastas são criados links simbólicos para os arquivos originais. Os apelidos das categorias também são apenas links para elas. Claro, a presença da pasta "Vitis" no diretório inicial pode não agradar a alguns. Podemos mudar para qualquer outro lugar:

vitis service set path /mnt/MyFavoriteDisk/Vitis/

Em um certo momento, fica claro que categorizar arquivos dispersos em diferentes locais faz pouco sentido, já que sua localização pode mudar. Portanto, para começar, criei um diretório onde simplesmente jogava tudo e atribuía categorias a isso. Depois, decidi que seria bom implementar isso em nível de programação. Assim nasceu o conceito de "espaço de arquivos". No início do uso vitis seria bom configurar um local assim (onde serão armazenados todos os arquivos necessários) e ativar o salvamento automático:

vitis service add filespace /mnt/MyFavoriteDisk/Filespace/

vitis service set autosave yes

Sem auto-salvamento ao usar o subtítulo «assign», será necessário um sinalizador —save, caso você deseje salvar o arquivo adicionado no espaço de arquivos.

Além disso, é possível adicionar vários espaços de arquivos e alterar suas prioridades, o que pode ser útil quando há muitos arquivos armazenados em diferentes mídias. Não abordarei essa possibilidade aqui, mas detalhes podem ser lidos na ajuda do programa.

Migração do sistema de arquivos semântico

De qualquer forma, o diretório Vitis e os espaços de arquivos teoricamente podem se mover de lugar às vezes. Para torná-los funcionais, eu criei uma utilidade separada link-editor, 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, após mudarmos de /mnt/MyFavoriteDisk/Vitis/ para o diretório home, os links simbólicos relacionados aos apelidos são editados. No segundo caso, após mudar a localização do espaço de arquivos, todos os links em Vitis são atualizados para novas com base na solicitação de substituição de parte de seu caminho.

Categorias automáticas

Se você executar o comando vitis service get autocategorization, será possível ver que, por padrão, estão configuradas categorias automáticas com base no formato (Format e Type) e na extensão dos arquivos (Extension).

Isso é útil quando, por exemplo, você precisa encontrar algo entre PDFs ou verificar o que você tem armazenado de EPUB e FB2, basta executar a consulta

vitis show Format/MOBI u: Format/FB2

Acontece que as ferramentas padrão do GNU/Linux, como file ou mimetype, não me satisfizeram exatamente por não definirem sempre corretamente o formato. Foi necessário criar minha própria implementação baseada em assinaturas de arquivos e extensões. De fato, o tema da determinação de formatos de arquivos é interessante para pesquisa e merece um artigo à parte. Por enquanto, posso dizer que, embora talvez eu não tenha previsto um reconhecimento preciso para todos os formatos do mundo, em geral, já está funcionando bem. Contudo, no momento, o EPUB é identificado como ZIP (algo que é justificado, mas na prática não deve ser considerado um comportamento normal). Até certo ponto, considere essa possibilidade como experimental e reportem bugs. Em situações estranhas, você sempre pode usar categorias baseadas em extensões de arquivos, como Extension/epub.

Se as autocatálogo do formato estiverem ativadas, também estarão disponíveis autocatálogo que agrupam alguns formatos por tipos como: «Arquivos», «Imagens», «Vídeos», «Áudio» e «Documentos». Nomes localizados também serão criados para essas subcategorias.

Sobre o que não foi mencionado

vitis tornou-se uma ferramenta bastante versátil, e é difícil cobrir tudo de uma vez. De forma resumida, mencionarei algumas outras funcionalidades que ainda podem ser feitas:

  • categorias podem ser removidas e desassociadas de arquivos;
  • os resultados das consultas podem ser copiados para um diretório especificado;
  • arquivos podem ser executados como programas;
  • o comando show possui várias opções, como ordenação por nome/data de modificação ou acessos/tamanho/extensão, exibição das propriedades dos arquivos e caminhos para os originais, inclusão da exibição de arquivos ocultos, entre outros;
  • ao salvar links para fontes da Internet, você também pode salvar cópias locais das páginas HTML.

Todos os detalhes podem ser encontrados na documentação do usuário.

Perspectivas

Os céticos frequentemente afirmam que "ninguém vai categorizar essas tags manualmente". Com minha experiência, posso provar o contrário: já categorizei mais de seis mil arquivos, criei mais de mil categorias e pseudônimos, e isso valeu a pena. Quando você usa um único comando vitis open Plano abre a lista de suas tarefas ou quando você usa um único comando vitis open LaTeX abre o livro de Stolyarov sobre o sistema de formatação LaTeX, fica moralmente difícil usar o sistema de arquivos "como antigamente".

A partir disso, surgem várias ideias. Por exemplo, é possível criar um rádio automático que toca música temática de acordo com o clima, feriados, dias da semana, horários ou épocas do ano. Outra ideia relacionada é um reprodutor musical que conhece categorias e pode tocar músicas com base em expressões onde as operações sobre categorias são tratadas como conjuntos. Seria útil desenvolver um daemon que monitore a pasta 'Downloads' e sugira a categorização de novos arquivos. E, claro, seria necessário criar um gerenciador de arquivos semântico gráfico adequado. Uma vez, até desenvolvi um serviço web para uso coletivo de arquivos para a empresa, mas não era prioridade e se tornou desatualizado, embora tenha alcançado um alto nível de funcionalidade. (Devido a grandes mudanças na própria) vitis, já não é utilizável.)

aqui está uma pequena demonstração

Categorias em vez de diretórios, ou Sistema de Arquivos Semântico para Linux

Conclusão

Vitis — não é a primeira tentativa de mudar radicalmente o estilo de trabalho com dados, mas considerei importante implementar minhas ideias e disponibilizar a implementação em acesso aberto sob a licença GNU GPL. Para conveniência, foi criado um pacote deb para x86-64, que deve funcionar em todas as distribuições modernas do Debian. Com ARM surgiram algumas dificuldades (embora todos os outros programas relacionados a vitis, funcionem normalmente), mas no futuro também será construído um pacote funcional para esta plataforma (armhf). Parei de criar pacotes RPM devido a problemas com o Fedora 30 e a dificuldade de me dispersar em várias distribuições RPM, mas eventualmente ainda farei pacotes para pelo menos algumas delas. Por enquanto, pode-se usar make && make install ou checkinstall.

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

Link para o repositório do projeto

Fonte: habr.com

Compre hospedagem confiável para sites com proteção contra DDoS, servidores VPS VDS 🔥 Compre hospedagem confiável para sites com proteção contra DDoS, servidores VPS VDS | ProHoster