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

A classificação de dados em si é um tópico de pesquisa interessante. Adoro coletar informações que parecem necessárias e sempre tentei criar hierarquias lógicas de diretórios para meus arquivos, e um dia, em um sonho, vi um programa bonito e conveniente para atribuir tags a arquivos e decidi que não poderia viver assim por mais tempo.

O problema dos sistemas de arquivos hierárquicos

Os usuários muitas vezes enfrentam 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 têm a intenção de serem lembrados por uma pessoa).

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

Atribuir categorias a arquivos elimina em grande parte o problema de armazenamento e busca de um arquivo: se você se lembrar (ou adivinhar) de pelo menos uma das categorias atribuídas a um arquivo, o arquivo nunca desaparecerá de vista.

Anteriormente, este tópico foi levantado mais de uma vez em Habré (tempo, два, três, quatro etc.), aqui descrevo minha solução.

Caminho para a Realização

Imediatamente após o sonho mencionado, descrevi em meu caderno a interface de comando que fornece o trabalho necessário com categorias. Então decidi que em uma semana ou duas eu poderia escrever um protótipo usando Python ou Bash, e então teria que trabalhar na criação de um shell gráfico em Qt ou GTK. A realidade, como sempre, revelou-se muito mais dura e o desenvolvimento atrasou-se.

A ideia original era, em primeiro lugar, fazer um programa com uma interface de linha de comando conveniente e concisa que pudesse criar, excluir categorias, atribuir categorias a arquivos e excluir categorias de arquivos. liguei para o programa Vitis.

Primeira tentativa de criar Vitis acabou em nada, pois muito tempo começou a ser gasto no trabalho e na faculdade. A segunda tentativa já foi alguma coisa: para a dissertação de mestrado consegui concluir o projeto planejado e até fazer um protótipo do shell GTK. Mas essa versão revelou-se tão pouco confiável e inconveniente que muita coisa teve que ser repensada.

Na verdade, eu mesmo usei a terceira versão por muito tempo, tendo transferido vários milhares de meus arquivos para categorias. Isso também foi muito facilitado pela conclusão do bash implementada. 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. Foi assim que cheguei à necessidade de resolver problemas complexos de desenvolvimento de software: escrever requisitos detalhados, desenvolver um sistema de testes funcionais, estudar instruções de empacotamento e muito mais. Cheguei agora ao meu plano, para que esta humilde criação possa ser apresentada à comunidade livre. O gerenciamento específico de arquivos, como o gerenciamento por meio do conceito de categorias, levanta questões e problemas inesperados, e na solução deles Vitis gerou mais cinco projetos em torno de si, alguns dos quais serão mencionados no artigo. Até agora Vitis Não comprei um shell gráfico, mas a conveniência de usar categorias de arquivos na linha de comando já supera para mim quaisquer vantagens de um gerenciador de arquivos gráfico normal.

Exemplos de uso

Vamos começar de forma simples - crie uma categoria:

vitis create Музыка

Vamos adicionar alguma composição como 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” usando o subcomando “show”:

vitis show Музыка

Você pode reproduzi-lo usando o subcomando “abrir”.

vitis open Музыка

Porque Se tivermos apenas um arquivo na categoria “Música”, apenas esse será iniciado. Com o propósito de abrir arquivos com seus programas padrão, criei um utilitário separado vts-fs-aberto (ferramentas padrão como xdg-open ou mimeopen não me agradaram por vários motivos; mas, na verdade, nas configurações você pode especificar outro utilitário para abertura universal de arquivos). Este utilitário funciona bem em diferentes distribuições com diferentes ambientes de trabalho, por isso recomendo instalá-lo junto com o Vitis.

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

vitis open Музыка --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, você será solicitado a criá-los. 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 da probabilidade e estatística matemática.pdf”. Sabemos que este arquivo já está categorizado como “R” e portanto podemos utilizar o caminho da categoria do sistema Vitis:

vitis assign Математика -v "R/Статистический пакет R: теория вероятностей и матстатистика.pdf"

Felizmente, a conclusão do bash torna isso mais fácil.

Vamos ver o que aconteceu, usando o sinalizador --categories para ver uma lista de categorias para 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 categorizados automaticamente por formato, tipo (combina formatos) e extensão de arquivo. Essas categorias podem ser desativadas, se desejado. Mais tarde, com certeza localizarei seus nomes.

Vamos adicionar algo mais à “Matemática” para variar:

vitis assign Математика -f "Математический анализ - 1984.pdf" Перельман_Занимательная_математика_1927.djvu 

E agora as coisas ficam interessantes. Em vez de categorias, você pode escrever expressões com operações de união, interseção e subtração, ou seja, utilizar operações em conjuntos. Por exemplo, a interseção de “Math” com “R” resultará em um arquivo.

vitis show R i: Математика

Subtraímos as referências à linguagem “R” de “Matemática”:

vitis show Математика  R  #или vitis show Математика c: R

Podemos combinar música e a linguagem R sem rumo:

vitis show Музыка u: R

O sinalizador -n permite “retirar” os arquivos necessários do resultado da solicitação por números e/ou intervalos, por exemplo, -n 3-7, ou algo mais complicado: -n 1,5,8-10,13. Muitas vezes é útil com o subcomando open, que permite abrir os arquivos desejados em uma lista.

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

Embora estejamos deixando de usar uma hierarquia de diretórios convencional, muitas vezes é útil ter categorias aninhadas. Vamos criar uma subcategoria “Estatísticas” na categoria “Matemática” e adicionar esta categoria ao arquivo apropriado:

vitis create Математика/Статистика

vitis assign Математика/Статистика -v "R/Введение в R.pdf"

vitis show Математика --categories

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

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

Abordar o caminho completo pode ser inconveniente, vamos criar um alias “global”:

vitis assign Математика/Статистика -a Статистика

vitis show Статистика

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

Não apenas arquivos normais

Links da Internet

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

vitis assign Хабр Цветоаномалия -i https://habr.com/ru/company/sfe_ru/blog/437304/ --yes

Um arquivo com o cabeçalho da página HTML e a extensão .desktop será criado em um local especial. Este é o formato de atalho tradicional no GNU/Linux. Esses atalhos são automaticamente categorizados como NetworkBookmarks.

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

vitis open Цветоаномалия

A execução do comando faz com que o link recém-salvo seja aberto no navegador. Atalhos categorizados para fontes da Internet podem servir como substitutos dos favoritos do navegador.

Fragmentos de arquivo

Também é útil ter categorias para partes individuais de arquivos. Não é um pedido ruim, hein? Mas a implementação atual até agora afeta apenas arquivos de texto simples, arquivos de áudio e vídeo. Digamos que você precise marcar uma determinada parte de um show ou um momento engraçado em um filme, então ao usar atribuir você pode usar os sinalizadores -fragname, -start, -finish. Vamos salvar o protetor de tela de "DuckTales":

vitis assign vitis assign -c Заставки -f Duck_Tales/s01s01.avi --finish 00:00:59 --fragname "Duck Tales intro"

vitis open Заставки

Na realidade, nenhum corte de arquivo ocorre; em vez disso, é criado um arquivo ponteiro para o fragmento, que descreve 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 fiz especialmente para esses fins - são mediafragmenter e fragplayer. O primeiro cria, o segundo abre. No caso de gravações de áudio e vídeo, o arquivo de mídia é lançado de uma determinada posição para uma determinada posição através do player VLC, portanto também deve estar no sistema. No começo eu queria fazer isso baseado no mplayer, mas por algum motivo ficou muito torto com posicionamento no momento certo.
Em nosso exemplo, o arquivo “Duck Tales intro.fragpointer” é criado (ele é colocado em um local especial) e, em seguida, um fragmento é reproduzido desde o início do arquivo (já que –start não foi especificado durante a criação) até o 59 segunda marca, após a qual o VLC fecha.

Outro exemplo é quando decidimos categorizar uma única apresentação num concerto de um artista famoso:

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

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

Ao ser aberto, o arquivo será incluído na posição desejada e fechará após quatro minutos e meio.

Como tudo funciona + recursos adicionais

Armazenando categorias

Logo no início de pensar em organizar um sistema de arquivos semântico, três formas me vieram à mente: através do armazenamento de 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 lado, o usuário tem a oportunidade de visualizar categorias diretamente do sistema de arquivos (e isso é conveniente e importante). No início do uso 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. Os diretórios correspondentes às categorias são criados em ~/Vitis, e links simbólicos para os arquivos originais são criados nesses diretórios de categorias. 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 agradar a algumas pessoas. Podemos mudar para qualquer outro local:

vitis service set path /mnt/MyFavoriteDisk/Vitis/

A certa altura, fica claro que não faz muito sentido categorizar arquivos espalhados em locais diferentes, já que sua localização pode mudar. Portanto, para começar, criei um diretório para mim, onde estupidamente joguei tudo fora e dei todas as categorias. Então decidi que seria bom formalizar esse momento em nível de programa. Foi assim que surgiu o conceito de “espaço de arquivo”. No início do uso Vitis Não faria mal nenhum configurar imediatamente esse local (todos os arquivos que precisamos serão armazenados lá) e ativar o salvamento automático:

vitis service add filespace /mnt/MyFavoriteDisk/Filespace/

vitis service set autosave yes

Sem salvamento automático, ao usar o subcomando "assign", o sinalizador --save será necessário se você quiser salvar o arquivo adicionado no espaço de arquivo.

Além disso, você pode adicionar vários espaços de arquivos e alterar suas prioridades; isso pode ser útil quando há muitos arquivos e eles estão armazenados em mídias diferentes. Não considerarei esta possibilidade aqui; detalhes podem ser encontrados na ajuda do programa.

Migração Semântica de Sistema de Arquivos

De qualquer forma, o diretório e os espaços de arquivo do Vitis podem, teoricamente, às vezes, se mover de um lugar para outro. Para fazer funcionar, criei um utilitário separado editor de links, 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 passarmos de /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 de arquivo, todos os links no Vitis são alterados para novos de acordo com a solicitação de substituição de parte de seu caminho.

Categorias automáticas

Se você executar o comando vitis service get autocategorization, você pode ver que, por padrão, as categorias automáticas são atribuídas por formato (Formato e Tipo) e extensão de arquivo (Extensão).

Isso é útil quando, por exemplo, você precisa encontrar algo entre PDFs ou ver o que armazenou em EPUB e FB2, basta executar a solicitação

vitis show Format/MOBI u: Format/FB2

Acontece que as ferramentas padrão do GNU/Linux, como file ou mimetype, não me agradaram precisamente porque nem sempre determinam corretamente o formato; tive que fazer minha própria implementação baseada em assinaturas e extensões de arquivos. Em geral, o tema da definição de formatos de arquivo é um tema interessante para pesquisa e merece um artigo separado. Por enquanto posso dizer que talvez não tenha proporcionado o verdadeiro reconhecimento para todos os formatos do mundo, mas no geral já está funcionando bem. É verdade que o EPUB agora define o formato como ZIP (em geral isso se justifica, mas na prática não deve ser considerado um comportamento normal). Por enquanto, considere esse recurso experimental e relate quaisquer bugs. Em situações estranhas, você sempre pode usar categorias de extensão de arquivo, por exemplo, Extensão/epub.

Se as autocategorias por formato estiverem habilitadas, também ficam habilitadas as autocategorias que agrupam 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 sendo uma ferramenta muito multifacetada e é difícil cobrir tudo de uma vez. Deixe-me mencionar brevemente o que mais você pode fazer:

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

Detalhes completos podem ser encontrados na ajuda do usuário.

Perspectivas

Os céticos costumam dizer que “ninguém definirá essas tags sozinho”. Usando meu próprio exemplo, posso provar o contrário: já categorizamos mais de seis mil arquivos, criei mais de mil categorias e aliases e valeu a pena. Quando uma equipe vitis open План abra sua lista de tarefas ou quando com um comando vitis open LaTeX Quando você abre o livro de Stolyarov sobre o sistema de layout LaTeX, já é moralmente difícil usar o sistema de arquivos “à moda antiga”.

Com base nisso, surgem várias ideias. Por exemplo, você pode fazer uma rádio automática que liga músicas temáticas de acordo com o clima atual, feriado, dia da semana, hora do dia ou ano. Ainda mais próximo do assunto está um reprodutor de música que conhece categorias e pode tocar música por expressão com operações em categorias e em conjuntos. É útil criar um daemon que monitore o diretório "Downloads" e ofereça a categorização de novos arquivos. E, claro, deveríamos criar um gerenciador de arquivos semântico gráfico normal. Era uma vez até criei um web service para a empresa para uso coletivo de arquivos, mas não era prioridade e se tornou irrelevante, embora tenha alcançado um alto nível de desempenho. (Devido a grandes mudanças no Vitis, não é mais 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 trabalhar com dados, mas considerei importante implementar minhas ideias e disponibilizar a implementação publicamente sob a licença GNU GPL. Por conveniência, um pacote deb foi feito para x86-64; ele deve funcionar em todas as distribuições Debian modernas. Houve pequenas dificuldades no ARM (enquanto todos os outros programas relacionados ao Vitis, funciona bem), mas no futuro um pacote funcional será compilado para esta plataforma (armhf). Parei de criar pacotes RPM por enquanto devido a problemas no Fedora 30 e à dificuldade de distribuição por muitas distribuições RPM, mas pacotes posteriores ainda serão feitos para pelo menos algumas delas. 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

Fonte: habr.com

Adicionar um comentário