¿Cómo puedo etiquetar archivos y buscarlos más tarde según la etiqueta?

15

Ejecutando Ubuntu Gnome.

Tengo muchos PDF y otros documentos y me gustaría etiquetarlos. Y búsquelos más tarde en función de estas etiquetas. Incluso si muevo los archivos a diferentes carpetas (entonces, las etiquetas se adhieren a los archivos).

Busqué pero los archivos y documentos no proporcionan estas opciones.

¿Estoy haciendo algo mal? ¿Cómo puedo etiquetar archivos para poder buscarlos en función de las etiquetas más adelante?

deshmukh
fuente
Para ver solo la parte de la pregunta de agregar etiquetas a documentos PDF (pero no la parte de la pregunta de las etiquetas de búsqueda), vea esta respuesta
karel,
¿Consideraría "marcar" un archivo como opción en lugar de etiquetarlo?
Sergiy Kolodyazhnyy
@Serg, no estoy claro. ¿Puedes explicar un poco? ¿Pueden estos marcadores tener etiquetas como los marcadores de Firefox? ¿Permanecerán incluso si muevo el archivo?
deshmukh
@deshmukh Esto es lo que he hecho antes: askubuntu.com/q/803644/295286 Básicamente, crea un enlace simbólico para archivar dentro de una carpeta. Por otro lado, podría implementar una especie de lista de etiquetas, y para cada etiqueta habría una lista de archivos. Actualmente estoy algo ocupado, por lo que me lleva una eternidad responder, pero intentaré publicar la respuesta lo antes posible. ¿Sería posible volver a poner la recompensa una vez que se agote?
Sergiy Kolodyazhnyy
@Serg No soy lo suficientemente rico como para ofrecer otra recompensa :) Pero si esta sale sin que nadie la gane (¿es eso posible?) Y si su respuesta (cuando se trata) es la mejor, seguro, ofreceré la recompensa a you :) :)
deshmukh

Respuestas:

9

Contenido:

  1. Introducción
  2. Instalación
  3. Uso
  4. Código fuente

1. Introducción

Esta solución consta de dos scripts: uno para etiquetar y otro para leer la lista de archivos bajo una etiqueta específica. Ambos tienen que vivir ~/.local/share/nautilus/scriptsy activarse haciendo clic con el botón derecho en el administrador de archivos Nautilus en cualquier archivo, y navegando al submenú Scripts. El código fuente para cada script se proporciona aquí, así como en GitHub

2. Instalación

Ambos scripts deben guardarse en ~/.local/share/nautilus/scripts, donde ~está el directorio de inicio del usuario, y hacerse ejecutables con chmod +x filename. Para una fácil instalación, use el siguiente 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:

Etiquetar archivos :

Seleccione los archivos en el administrador de archivos Nautilus, haga clic derecho sobre ellos y navegue hasta el submenú Scripts. Seleccionar tag_file.py. Presione la Enter ingrese la descripción de la imagen aquí primera vez que ejecute este script, no habrá ningún archivo de configuración, por lo que verá esto:

ingrese la descripción de la imagen aquí

La próxima vez, cuando ya tenga algunos archivos etiquetados, verá una ventana emergente que le permite seleccionar una etiqueta y / o agregar una nueva (de esta manera puede grabar archivos en varias etiquetas). Presiona OKpara agregar archivos a esta etiqueta. Nota : Evite tener "|" símbolo en el nombre de la etiqueta.

ingrese la descripción de la imagen aquí

El guión registra todo en ~/.tagged_files. Ese archivo es esencialmente un jsondiccionario (que no es algo que a los usuarios normales les debería interesar, pero es conveniente para los programadores :)). El formato de ese archivo es el siguiente:

{
    "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"
    ]
}

Si alguna vez desea "desetiquetar" algún archivo, simplemente elimine una entrada de esa lista. Cuidado con el formato y las comas.

Buscando por etiqueta :

Ahora que tiene una buena ~/.tagged_filesbase de datos de archivos, puede leer ese archivo o usarread_tags.py script.

Haga clic derecho sobre cualquier archivo en Nautilus (realmente no importa cuál) .Seleccione read_tags.py. GolpearEnter ingrese la descripción de la imagen aquí

Verá una ventana emergente que le preguntará qué etiqueta desea buscar:

ingrese la descripción de la imagen aquí

Seleccione uno, haga clic OK. Verá un cuadro de diálogo de lista que muestra que desea que haya archivos para la etiqueta que seleccionó. Puede seleccionar cualquier archivo individual y se abrirá con un programa predeterminado asignado a ese tipo de archivo.

ingrese la descripción de la imagen aquí

4. Código fuente:

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
fuente
Esto es genial. siempre tienes las soluciones más interesantes.
@Serg esto es maravilloso. ¿Se pegarán las etiquetas cuando mueva los archivos? O cuando elimine los archivos, ¿seguirán apareciendo en los resultados de búsqueda?
deshmukh
@deshmukh No, las etiquetas no se pegan si mueve los archivos, y los archivos eliminados aparecen. Podría implementar la comprobación de archivos eliminados (en realidad es bastante fácil, solo son unas pocas líneas). Esencialmente, usted tiene una base de datos de etiquetas y sus archivos, y esta base de datos debe mantenerse
Sergiy Kolodyazhnyy
@Serg estamos tan cerca pero tan lejos. Porque a menos que las etiquetas se 'peguen' a los archivos (para que permanezcan incluso después de mover el archivo), es tan bueno o tan malo como una estructura de directorio jerárquico, excepto que un archivo puede tener varias etiquetas. No estoy, ni por un momento, menospreciando su excelente trabajo. Solo estoy diciendo que todavía no cubre mis necesidades (que pueden ser locas). Además, como dijo jargonjunkie en un comentario separado, etiquetar los archivos directamente podría ser la solución (como etiquetamos fotografías o marcadores). Pero estas son palabras de un novato.
deshmukh
@deshmukh Estoy de acuerdo, etiquetar archivos directamente sería ideal. Simplemente no he encontrado una manera de hacerlo, al menos no todavía. He intentado algunos enfoques, pero no dieron ningún resultado. Potencialmente podría hacer un script que verifique periódicamente si todos los archivos están en su lugar, pero eso es lo mejor que puedo hacer, y sería muy ineficiente si la cantidad de archivos aumentara en el archivo de configuración. Espero que esto pueda ser útil para algunos, pero estoy de acuerdo, esta no es exactamente la solución que estás buscando
Sergiy Kolodyazhnyy
1

He encontrado una manera de hacer esto.

Abra una terminal ( CTRL+ ALT+ T) y luego ejecute este comando:

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

Ingrese su contraseña, y cuando se le solicite, presione enter, luego ejecute

sudo apt-get update

luego

sudo apt-get install tracker tracker-gui

No se preocupe si dice que ya es la última versión.

Ahora abra Nautilus / Files y haga clic derecho en el documento al que desea agregar etiquetas. Seleccione propiedades, luego seleccione la pestaña que dice "Etiquetas". Ingrese una etiqueta en el cuadro de texto y presione Intro o haga clic en el botón Agregar para agregarla. También puede hacer clic en una etiqueta que ya ha agregado y seleccionar el botón Eliminar para eliminar una etiqueta. Tenga en cuenta que las etiquetas distinguen entre mayúsculas y minúsculas. Las etiquetas que cree serán persistentes en todo el sistema, por lo que puede marcar fácilmente una etiqueta que ya creó para marcar el archivo en lugar de volver a escribirlo manualmente.

Después de etiquetar los elementos deseados, ahora puede buscarlos, pero no en Archivos. Ve a actividades y busca la aplicaciónDesktop Search . Lánzalo y mira las opciones en la parte superior. En la parte superior izquierda de la ventana, haga clic en el icono de la carpeta con la información sobre herramientas "Mostrar resultados por archivos en una lista". Ahora tienes más opciones. Seleccione la opción a la izquierda del cuadro de búsqueda con la información sobre herramientas "Buscar criterios de búsqueda solo en etiquetas de archivo". ¡Ahora puedes buscar etiquetas!

Para usar esto, ingrese las etiquetas que desea buscar, separadas por comas y presione Entrar. Por ejemplo:

Importante, septiembre, presentación

Esto solo mostrará archivos que tengan las tres etiquetas: "Importante", "Septiembre" y "Presentación".

Al hacer doble clic en uno, se abrirá el archivo en el programa predeterminado, y al hacer clic derecho y seleccionar "Mostrar directorio principal", se abrirá su ubicación en Nautilus.

En Desktop Search, también puede hacer clic en el segundo botón de la derecha en la parte superior de la ventana (generalmente una estrella o corazón) para editar etiquetas en la aplicación.

¡Ahí tienes! Espero que esto ayude. Si tiene más preguntas, hágamelo saber.

ComputerGuy
fuente
0

Respuesta corta: Esto no es posible de forma nativa en Ubuntu. Necesita alguna extensión o una base de datos de documentos, como lo sugieren las otras respuestas.

Otra opción que puedo recomendar es usar la aplicación TagSpaces . Esta aplicación puede guardar etiquetas en el nombre del archivo , lo que hace que el etiquetado sea duradero y portátil. Puede editar el nombre del archivo en Nautilus o dentro de su Cloud-Storage y la etiqueta aparecerá en TagSpaces y viceversa.

captura de pantalla

soportes de píxeles
fuente