Como posso marcar arquivos e pesquisá-los posteriormente com base na marca?

15

Executando o Ubuntu Gnome.

Tenho muitos PDF e outros documentos e gostaria de marcá-los. E pesquise-os posteriormente com base nessas tags. Mesmo se eu mover os arquivos para pastas diferentes (as tags ficam nos arquivos).

Eu procurei, mas Arquivos e Documentos não fornecem essas opções.

Estou fazendo algo errado? Como posso marcar arquivos para pesquisá-los com base em tags posteriormente?

deshmukh
fonte
Por apenas as tags Somando-se documentos PDF parte da pergunta (mas não a parte etiquetas de busca de questão) ver esta resposta
Karel
Você consideraria "marcar" um arquivo como opção em vez de marcar?
Sergiy Kolodyazhnyy
@Serg Eu não estou claro. Você pode explicar um pouco? Esses indicadores podem ter tags como indicadores do Firefox? Eles permanecerão mesmo se eu mover o arquivo?
deshmukh 22/09
@deshmukh Aqui está o que eu fiz antes: askubuntu.com/q/803644/295286 Basicamente, ele cria um link simbólico para arquivo dentro de uma pasta. Por outro lado, eu poderia implementar um tipo de lista de tags e, para cada tag, haveria uma lista de arquivos. Atualmente, estou um pouco ocupado, por isso levo uma eternidade para responder, mas tentarei colocar a resposta o mais rápido possível. Seria possível colocar a recompensa novamente uma vez que esta expire?
Sergiy Kolodyazhnyy
@Serg Eu não sou rico o suficiente para oferecer outra recompensa :) Mas se esta for feita sem que ninguém a ganhe (isso é possível?) E se sua resposta (quando vier) for a melhor, com certeza, eu oferecerei a recompensa a you :) :)
deshmukh

Respostas:

9

Conteúdo:

  1. Introdução
  2. Instalação
  3. Uso
  4. Código fonte

1. Introdução

Esta solução consiste em dois scripts - um para marcação, um para leitura da lista de arquivos sob uma marcação específica. Ambos têm que viver~/.local/share/nautilus/scripts e ativados através do clique com o botão direito do mouse no gerenciador de arquivos do Nautilus, em qualquer arquivo, e navegando para o submenu Scripts. O código fonte de cada script é fornecido aqui, assim como no GitHub

2. Instalação

Ambos os scripts devem ser salvos em ~/.local/share/nautilus/scripts, onde ~fica o diretório inicial do usuário e executados com chmod +x filename. Para facilitar a instalação, use o seguinte script bash:

#!/bin/bash

N_SCRIPTS="$HOME/.local/share/nautilus/scripts"
cd /tmp
rm master.zip*
rm -rf nautilus_scripts-master
wget https://github.com/SergKolo/nautilus_scripts/archive/master.zip
unzip master.zip
install nautilus_scripts-master/tag_file.py "$N_SCRIPTS/tag_file.py"
install nautilus_scripts-master/read_tags.py "$N_SCRIPTS/read_tags.py"

3. Uso:

Marcando arquivos :

Selecione os arquivos no gerenciador de arquivos do Nautilus, clique com o botão direito do mouse neles e navegue até o submenu Scripts. Selecione tag_file.py. Hit Na Enter insira a descrição da imagem aqui primeira vez em que você executar esse script, não haverá arquivo de configuração; portanto, você verá isso:

insira a descrição da imagem aqui

Da próxima vez, quando você já tiver alguns arquivos marcados, verá um pop-up que permite selecionar uma tag e / ou adicionar uma nova (dessa forma, você pode gravar arquivos em várias tags). Clique OKpara adicionar arquivos a esta tag. Nota : Evite ter "|" símbolo no nome da marca.

insira a descrição da imagem aqui

O script registra tudo em ~/.tagged_files. Esse arquivo é essencialmente um jsondicionário (que não é algo que os usuários comuns devam se preocupar, mas é conveniente para programadores :)). O formato desse arquivo é o seguinte:

{
    "Important Screenshots": [
        "/home/xieerqi/\u56fe\u7247/Screenshot from 2016-10-01 09-15-46.png",
        "/home/xieerqi/\u56fe\u7247/Screenshot from 2016-09-30 18-47-12.png",
        "/home/xieerqi/\u56fe\u7247/Screenshot from 2016-09-30 18-46-46.png",
        "/home/xieerqi/\u56fe\u7247/Screenshot from 2016-09-30 17-35-32.png"
    ],
    "Translation Docs": [
        "/home/xieerqi/Downloads/908173 - \u7ffb\u8bd1.doc",
        "/home/xieerqi/Downloads/911683\u7ffb\u8bd1.docx",
        "/home/xieerqi/Downloads/914549 -\u7ffb\u8bd1.txt"
    ]
}

Se você quiser "desmarcar" algum arquivo, exclua uma entrada dessa lista. Observe o formato e as vírgulas.

Pesquisando por tag :

Agora que você possui um bom ~/.tagged_filesbanco de dados de arquivos, pode ler esse arquivo ou usar o read_tags.pyscript.

Clique com o botão direito do mouse em qualquer arquivo do Nautilus (realmente não importa qual) read_tags.py. BaterEnter insira a descrição da imagem aqui

Você verá um pop-up perguntando qual tag você deseja pesquisar:

insira a descrição da imagem aqui

Selecione um, clique OK. Você verá uma caixa de diálogo da lista mostrando que os arquivos estão lá para a tag que você selecionou. Você pode selecionar qualquer arquivo único e ele será aberto com um programa padrão atribuído a esse tipo de arquivo.

insira a descrição da imagem aqui

4. Código fonte:

tag_file.py:

#!/usr/bin/env python3
# -*- coding: utf-8 -*-

# Author: Serg Kolo  
# Date: Oct 1st, 2016
# Description: tag_file.py, script for
#    recording paths to files under 
#    specific , user-defined tag
#    in ~/.tagged_files
# Written for: http://askubuntu.com/q/827701/295286
# Tested on : Ubuntu ( Unity ) 16.04

from __future__ import print_function
import subprocess
import json
import os
import sys

def show_error(string):
    subprocess.call(['zenity','--error',
                     '--title',__file__,
                     '--text',string
    ])
    sys.exit(1)

def run_cmd(cmdlist):
    """ Reusable function for running external commands """
    new_env = dict(os.environ)
    new_env['LC_ALL'] = 'C'
    try:
        stdout = subprocess.check_output(cmdlist, env=new_env)
    except subprocess.CalledProcessError:
        pass
    else:
        if stdout:
            return stdout


def write_to_file(conf_file,tag,path_list):

    # if config file exists , read it
    data = {}
    if os.path.exists(conf_file):
        with open(conf_file) as f:
            data = json.load(f)

    if tag in data:
        for path in path_list:
            if path in data[tag]:
               continue
            data[tag].append(path)
    else:
        data[tag] = path_list

    with open(conf_file,'w') as f:
        json.dump(data,f,indent=4,sort_keys=True)

def get_tags(conf_file):

    if os.path.exists(conf_file):
       with open(conf_file) as f:
            data = json.load(f)
            return '|'.join(data.keys())

def main():

    user_home = os.path.expanduser('~')
    config = '.tagged_files'
    conf_path = os.path.join(user_home,config)
    file_paths = [ os.path.abspath(f) for f in sys.argv[1:] ]
    tags = None

    try:
        tags = get_tags(conf_path)
    except Exception as e:
        show_error(e)

    command = [ 'zenity','--forms','--title',
                'Tag the File' 
    ]

    if tags:
       combo = ['--add-combo','Existing Tags',
                '--combo-values',tags
       ]

       command = command + combo

    command = command + ['--add-entry','New Tag']

    result = run_cmd(command)
    if not result: sys.exit(1)
    result = result.decode().strip().split('|')
    for tag in result:
        if tag == '':
           continue
        write_to_file(conf_path,tag,file_paths)

if __name__ == '__main__':
     main()

read_tags.py:

#!/usr/bin/env python3
# -*- coding: utf-8 -*-

# Author: Serg Kolo  
# Date: Oct 1st, 2016
# Description: read_tags.py, script for
#    reading  paths to files under 
#    specific , user-defined tag
#    in ~/.tagged_files
# Written for: http://askubuntu.com/q/827701/295286
# Tested on : Ubuntu ( Unity ) 16.04

import subprocess
import json
import sys
import os


def run_cmd(cmdlist):
    """ Reusable function for running external commands """
    new_env = dict(os.environ)
    new_env['LC_ALL'] = 'C'
    try:
        stdout = subprocess.check_output(cmdlist, env=new_env)
    except subprocess.CalledProcessError as e:
        print(str(e))
    else:
        if stdout:
            return stdout

def show_error(string):
    subprocess.call(['zenity','--error',
                     '--title',__file__,
                     '--text',string
    ])
    sys.exit(1)

def read_tags_file(file,tag):

    if os.path.exists(file):
       with open(file) as f:
            data = json.load(f)
            if tag in data.keys():
                return data[tag]
            else:
                show_error('No such tag')
    else:
       show_error('Config file doesnt exist')

def get_tags(conf_file):
    """ read the tags file, return
        a string joined with | for
        further processing """    
    if os.path.exists(conf_file):
       with open(conf_file) as f:
            data = json.load(f)
            return '|'.join(data.keys())

def main():

    user_home = os.path.expanduser('~')
    config = '.tagged_files'
    conf_path = os.path.join(user_home,config)

    tags = get_tags(conf_path)
    command = ['zenity','--forms','--add-combo',
               'Which tag ?', '--combo-values',tags
    ]

    tag = run_cmd(command)

    if not tag:
       sys.exit(0)

    tag = tag.decode().strip()
    file_list = read_tags_file(conf_path,tag)
    command = ['zenity', '--list', 
               '--text','Select a file to open',
               '--column', 'File paths'
    ]
    selected = run_cmd(command + file_list)    
    if selected:
       selected = selected.decode().strip()
       run_cmd(['xdg-open',selected])

if __name__ == '__main__':
    try:
        main()
    except Exception as e:
        show_error(str(e))

Sergiy Kolodyazhnyy
fonte
isso é legal. você sempre tem as soluções mais interessantes.
@Erg isso é maravilhoso. As tags permanecerão quando eu mover os arquivos? Ou quando eu excluir os arquivos, eles ainda serão exibidos nos resultados da pesquisa?
Deshmukh 02/10
@deshmukh Não, as tags não grudam se você mover os arquivos, e os arquivos excluídos são exibidos. Eu poderia implementar a verificação de arquivos excluídos (com bastante facilidade, na verdade, são apenas algumas linhas). Essencialmente, você tem um banco de dados de tags e seus arquivos, a ANS esta base de dados tem de ser mantido
Sergiy Kolodyazhnyy
@Erg estamos tão perto ainda tão longe. Porque, a menos que o tipo de tag 'cole' nos arquivos (para que eles permaneçam mesmo depois de mover o arquivo), é tão bom ou tão ruim quanto uma estrutura de diretório hierárquica, exceto que um arquivo pode ter várias tags. Nem por um momento menosprezo seu excelente trabalho. Só estou dizendo que ele ainda não atende às minhas necessidades (podem ser loucas). Além disso, como jargonjunkie disse em um comentário separado, pode estar etiquetando os arquivos diretamente, pode ser a solução (como etiquetamos fotografias ou marcadores). Mas estas são palavras de um novato.
Deshmukh
@deshmukh Concordo, marcar arquivos diretamente seria o ideal. Simplesmente não encontrei uma maneira de fazê-lo, ainda não pelo menos. Eu tentei algumas abordagens, mas elas não produziram nenhum resultado. Eu poderia criar um script que verifique periodicamente se todos os arquivos estão no lugar, mas isso é o melhor que posso fazer, e seria altamente ineficiente se o número de arquivos aumentar no arquivo de configuração. Espero que este pode ser útil para alguns, mas eu concordo - este não é exatamente uma solução que você está procurando
Sergiy Kolodyazhnyy
1

Eu encontrei uma maneira de fazer isso.

Abra um terminal ( CTRL+ ALT+ T) e execute este comando:

sudo add-apt-repository ppa:tracker-team/tracker

Digite sua senha e, quando solicitado, pressione enter e execute

sudo apt-get update

então

sudo apt-get install tracker tracker-gui

Não se preocupe se ele já é a versão mais recente.

Agora abra o Nautilus / Files e clique com o botão direito do mouse no documento ao qual deseja adicionar tags. Selecione propriedades e selecione a guia que diz "Tags". Digite uma marca na caixa de texto e pressione Enter ou clique no botão Adicionar para adicioná-la. Você também pode clicar em uma marca que você já adicionou e selecionar o botão Remover para remover uma marca. Observe que as tags diferenciam maiúsculas de minúsculas. As tags que você criar serão persistentes em todo o sistema, para que você possa marcar facilmente ao lado de uma tag que você já criou para marcar o arquivo em vez de digitá-lo manualmente novamente.

Depois de marcar os itens desejados, agora você pode procurá-los, mas não em Arquivos. Vá para atividades e procure o aplicativo Desktop Search. Inicie e veja as opções na parte superior. No lado superior esquerdo da janela, clique no ícone da pasta com a dica de ferramenta "Exibir resultados por arquivos em uma lista". Agora você tem mais opções. Selecione a opção à esquerda da caixa de pesquisa com a dica de ferramenta "Localizar critérios de pesquisa apenas em tags de arquivo". Agora você pode pesquisar tags!

Para usar isso, insira as tags que deseja pesquisar, separadas por vírgulas e pressione enter. Por exemplo:

Importante, setembro, apresentação

Isso exibirá apenas os arquivos com as três tags: "Importante", "Setembro" e "Apresentação".

Ao clicar duas vezes em um, ele abrirá o arquivo no programa padrão e, ao clicar com o botão direito do mouse e selecionar "Mostrar diretório pai", abrirá sua localização no Nautilus.

Na Pesquisa na área de trabalho, você também pode clicar no segundo botão à direita na parte superior da janela (geralmente uma estrela ou coração) para editar as tags no próprio aplicativo!

Aí está! Espero que isto ajude. Se você tiver mais alguma dúvida, me avise.

ComputerGuy
fonte
0

Resposta curta: Isso não é possível nativamente no Ubuntu. Você precisa de alguma extensão ou banco de dados de documentos, conforme sugerido pelas outras respostas.

Outra opção que posso recomendar é usar o aplicativo TagSpaces . Este aplicativo pode salvar tags no nome do arquivo , o que torna a marcação durável e portátil. Você pode editar o nome do arquivo no Nautilus ou no seu Cloud-Storage e a tag aparecerá no TagSpaces e vice-versa.

captura de tela

pixelbrackets
fonte