Come posso taggare i file e cercarli in seguito in base al tag?


15

Esecuzione di Ubuntu Gnome.

Ho molti PDF e altri documenti e mi piacerebbe taggarli. E cercali in seguito in base a questi tag. Anche se sposto i file in cartelle diverse (quindi i tag si attaccano ai file).

Ho cercato ma File e documenti non forniscono queste opzioni.

Sto facendo qualcosa di sbagliato? Come posso taggare i file in modo da poterli cercare in base ai tag in un secondo momento?


Per solo l'aggiunta di tag ai documenti PDF parte della domanda (ma non i tag di ricerca parte della domanda) vedere questa risposta
karel

Considereresti di "aggiungere un segnalibro" a un file come opzione invece di taggarlo?
Sergiy Kolodyazhnyy,

@Serg Non sono chiaro. Puoi spiegarci un po '? Questi segnalibri possono avere tag come i segnalibri di Firefox? Rimarranno anche se sposto il file?
deshmukh,

@deshmukh Ecco cosa ho fatto prima: askubuntu.com/q/803644/295286 Fondamentalmente crea un link simbolico al file all'interno di una cartella. D'altra parte, potrei implementare una sorta di elenco di tag e per ogni tag ci sarebbe un elenco di file. Attualmente sono un po 'occupato, quindi mi ci vuole un'eternità a rispondere, ma cercherò di dare la risposta il prima possibile. Sarebbe possibile rimettere la taglia una volta fuori questa volta?
Sergiy Kolodyazhnyy,

@Serg Non sono abbastanza ricco per offrire un altro dono :) Ma se questo non ha nessuno vincerlo (è possibile?) E se la tua risposta (quando arriva) è la migliore, certo, offrirò il dono a tu :) :)
deshmukh,

Risposte:


9

Contenuti:

  1. introduzione
  2. Installazione
  3. uso
  4. Codice sorgente

1. Introduzione

Questa soluzione è composta da due script: uno per la codifica, uno per la lettura dell'elenco di file con tag specifici. Entrambi devono risiedere ~/.local/share/nautilus/scriptse attivarsi facendo clic con il tasto destro del mouse sul file manager Nautilus su qualsiasi file e accedendo al sottomenu Script. Il codice sorgente per ogni script è fornito qui e su GitHub

2. Installazione

Entrambi gli script devono essere salvate ~/.local/share/nautilus/scripts, in cui ~è la home directory dell'utente, e reso eseguibile chmod +x filename. Per una facile installazione, utilizzare il seguente 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. Utilizzo:

Taggare i file :

Seleziona i file nel file manager Nautilus, fai clic con il tasto destro su di essi e vai al sottomenu Script. Selezionare tag_file.py. Premi La Enter inserisci qui la descrizione dell'immagine prima volta che esegui questo script, non ci saranno file di configurazione, quindi vedrai questo:

inserisci qui la descrizione dell'immagine

La prossima volta, quando hai già alcuni file taggati, vedrai un popup che ti consente di selezionare un tag e / o aggiungerne uno nuovo (in questo modo puoi registrare i file sotto più tag). Premi OKper aggiungere file a questo tag. Nota : evitare di avere "|" simbolo nel nome del tag.

inserisci qui la descrizione dell'immagine

Lo script registra tutto in ~/.tagged_files. Quel file è essenzialmente un jsondizionario (che non dovrebbe interessare agli utenti normali, ma è conveniente per i programmatori :)). Il formato di quel file è il seguente:

{
    "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 vuoi mai "deselezionare" un file, elimina semplicemente una voce da quell'elenco. Fai attenzione al formato e alle virgole.

Ricerca per tag :

Ora che hai un bel ~/.tagged_filesdatabase di file, puoi leggere quel file o usare lo read_tags.pyscript.

Fai clic con il tasto destro su qualsiasi file in Nautilus (non importa quale) read_tags.py. Seleziona . ColpireEnter inserisci qui la descrizione dell'immagine

Vedrai un popup che ti chiede quale tag vuoi cercare:

inserisci qui la descrizione dell'immagine

Selezionane uno, fai clic su OK. Vedrai una finestra di dialogo che mostra che desideri che i file siano presenti per il tag selezionato. Puoi selezionare qualsiasi singolo file e si aprirà con un programma predefinito assegnato a quel tipo di file.

inserisci qui la descrizione dell'immagine

4. Codice sorgente:

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))


è bello hai sempre le soluzioni più interessanti.

@Serg questo è meraviglioso. I tag si attaccheranno quando sposto i file? O quando elimino i file, verranno comunque visualizzati nei risultati della ricerca?
deshmukh,

@deshmukh No, i tag non si attaccano se si spostano i file e vengono visualizzati i file eliminati. Potrei implementare il controllo dei file eliminati (abbastanza facilmente in realtà, sono solo poche righe). Essenzialmente hai un database di tag e i loro file, e questo database deve essere mantenuto
Sergiy Kolodyazhnyy

@Serg siamo così vicini eppure così lontani. Perché a meno che i tag non si attacchino ai file (in modo che rimangano anche dopo aver spostato il file), è buono o cattivo come una struttura di directory gerarchica, tranne per il fatto che un file può avere più tag. Non sto nemmeno sminuendo per un momento il tuo eccellente lavoro. Sto solo dicendo che non soddisfa ancora i miei bisogni (forse, folli). Inoltre, come ha detto jargonjunkie in un commento separato, la codifica diretta dei file potrebbe essere la soluzione (come se tagassimo fotografie o segnalibri). Ma queste sono le parole di un principiante.
deshmukh,

@deshmukh Sono d'accordo, taggare direttamente i file sarebbe l'ideale. Semplicemente non ho trovato un modo per farlo, non ancora almeno. Ho provato alcuni approcci, ma non hanno prodotto risultati. Potrei potenzialmente creare uno script che controlli periodicamente se tutti i file sono presenti, ma è il migliore che posso fare, e sarebbe altamente inefficiente se il numero di file aumenta nel file di configurazione. Spero che questo possa essere utile ad alcuni, ma sono d'accordo - questa non è esattamente una soluzione che stai cercando
Sergiy Kolodyazhnyy,

1

Ho trovato un modo per farlo.

Apri un terminale ( CTRL+ ALT+ T) e quindi esegui questo comando:

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

Immettere la password e, quando richiesto, premere Invio, quindi eseguire

sudo apt-get update

poi

sudo apt-get install tracker tracker-gui

Non preoccuparti se dice che è già l'ultima versione.

Ora apri Nautilus / Files e fai clic con il pulsante destro del mouse sul documento a cui desideri aggiungere i tag. Seleziona le proprietà, quindi seleziona la scheda "Tag". Inserisci un tag nella casella di testo e premi invio o fai clic sul pulsante Aggiungi per aggiungerlo. Puoi anche fare clic su un tag che hai già aggiunto e selezionare il pulsante Rimuovi per rimuovere un tag. Tieni presente che i tag fanno distinzione tra maiuscole e minuscole. I tag che creerai saranno persistenti in tutto il sistema, quindi puoi facilmente mettere un segno di spunta accanto a un tag che hai già creato per contrassegnare il file anziché digitarlo di nuovo manualmente.

Dopo aver taggato gli elementi desiderati, ora puoi cercarli, ma non in File. Vai alle attività e cerca l'app Desktop Search. Avvialo e guarda le opzioni in alto. Nella parte in alto a sinistra della finestra, fai clic sull'icona della cartella con il suggerimento "Visualizza risultati per file in un elenco". Ora hai più opzioni. Seleziona l'opzione a sinistra della casella di ricerca con la descrizione "Trova criteri di ricerca solo nei tag file". Ora puoi cercare i tag!

Per usarlo, inserisci i tag che vuoi cercare, separati da virgole e premi invio. Per esempio:

Importante, settembre, presentazione

Questo mostrerà solo i file che hanno tutti e tre i tag: "Importante", "Settembre" e "Presentazione".

Facendo doppio clic su uno, aprirà il file nel programma predefinito e facendo clic con il tasto destro e selezionando "Mostra directory principale", aprirà la sua posizione in Nautilus.

In Desktop Search, puoi anche fare clic sul secondo pulsante dalla destra nella parte superiore della finestra (di solito una stella o un cuore) per modificare i tag nell'app stessa!

Ecco qua! Spero che sia di aiuto. Se hai altre domande, fammi sapere.


0

Risposta breve: questo non è possibile in modo nativo in Ubuntu. Hai bisogno di qualche estensione o di un database di documenti, come suggerito dalle altre risposte.

Un'altra opzione che posso consigliare è quella di utilizzare l'app TagSpaces . Questa app può salvare i tag nel nome file , il che rende la marcatura duratura e portatile. Puoi modificare il nome del file in Nautilus o nel tuo Cloud-Storage e il tag apparirà in TagSpaces e viceversa.

immagine dello schermo

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.