Comment puis-je baliser des fichiers et les rechercher plus tard en fonction de la balise?

15

Exécuter Ubuntu Gnome.

J'ai beaucoup de PDF et d'autres documents et j'aimerais les étiqueter. Et recherchez-les plus tard en fonction de ces balises. Même si je déplace les fichiers dans différents dossiers (les balises restent donc sur les fichiers).

J'ai recherché mais les fichiers et les documents ne proposent pas ces options.

Est-ce que je fais quelque chose de mal? Comment puis-je baliser des fichiers afin de pouvoir les rechercher en fonction des balises plus tard?

deshmukh
la source
Pour seulement la partie ajout de balises aux documents PDF de la question (mais pas la partie balises de recherche de la question) voir cette réponse
karel
Envisageriez-vous de «mettre en signet» un fichier comme option au lieu de baliser?
Sergiy Kolodyazhnyy
@Serg, je ne suis pas clair. Pouvez-vous expliquer un peu? Ces signets peuvent-ils avoir des balises comme les signets Firefox? Resteront-ils même si je déplace le fichier?
deshmukh
@deshmukh Voici ce que j'ai fait auparavant: askubuntu.com/q/803644/295286 Fondamentalement, il crée un lien symbolique vers un fichier dans un dossier. D'un autre côté, je pourrais implémenter une sorte de liste de balises, et pour chaque balise, il y aurait une liste de fichiers. Actuellement, je suis un peu occupé, il me faut donc une éternité pour répondre, mais je vais essayer de répondre le plus tôt possible. Serait-il possible de remettre la prime une fois celle-ci expirée?
Sergiy Kolodyazhnyy
@Serg Je ne suis pas assez riche pour offrir une autre prime :) Mais si celle-ci va sans que personne ne la gagne (est-ce même possible?) Et si votre réponse (quand elle vient) est la meilleure, bien sûr, je vais offrir la prime à vous :) :)
deshmukh

Réponses:

9

Contenu:

  1. introduction
  2. Installation
  3. Usage
  4. Code source

1. Introduction

Cette solution se compose de deux scripts - un pour le balisage, un pour la lecture de la liste des fichiers sous une balise spécifique. Les deux doivent vivre ~/.local/share/nautilus/scriptset être activés via un clic droit dans le gestionnaire de fichiers Nautilus sur n'importe quel fichier et en naviguant vers le sous-menu Scripts. Le code source de chaque script est fourni ici ainsi que sur GitHub

2. Installation

Les deux scripts doivent être enregistrés dans ~/.local/share/nautilus/scripts, où se ~trouve le répertoire personnel de l'utilisateur, et rendus exécutables avec chmod +x filename. Pour une installation facile, utilisez le script bash suivant:

#!/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. Utilisation:

Balisage des fichiers :

Sélectionnez les fichiers dans le gestionnaire de fichiers Nautilus, faites un clic droit dessus et accédez au sous-menu Scripts. Sélectionnez tag_file.py. Hit La Enter entrez la description de l'image ici première fois que vous exécutez ce script, il n'y aura pas de fichier de configuration, vous verrez donc ceci:

entrez la description de l'image ici

La prochaine fois, lorsque vous avez déjà des fichiers balisés, vous verrez une fenêtre contextuelle qui vous permet de sélectionner une balise et / ou d'en ajouter une nouvelle (de cette façon, vous pouvez enregistrer des fichiers sous plusieurs balises). Appuyez sur OKpour ajouter des fichiers à cette balise. Remarque : évitez d'avoir "|" symbole dans le nom de la balise.

entrez la description de l'image ici

Le script enregistre tout ~/.tagged_files. Ce fichier est essentiellement un jsondictionnaire (ce qui n'est pas quelque chose qui devrait intéresser les utilisateurs réguliers, mais il est pratique pour les programmeurs :)). Le format de ce fichier est le suivant:

{
    "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 jamais vous voulez "décocher" un fichier, supprimez simplement une entrée de cette liste. Attention au format et aux virgules.

Recherche par tag :

Maintenant que vous avez une belle ~/.tagged_filesbase de données de fichiers, vous pouvez soit lire ce fichier, soit utiliser un read_tags.pyscript.

Faites un clic droit sur n'importe quel fichier dans Nautilus (peu importe lequel) read_tags.py. Sélectionnez . FrappéEnter entrez la description de l'image ici

Vous verrez une fenêtre contextuelle vous demandant quelle balise vous souhaitez rechercher:

entrez la description de l'image ici

Sélectionnez-en un, cliquez sur OK. Vous verrez une boîte de dialogue de liste indiquant que vous voulez que les fichiers soient là pour la balise que vous avez sélectionnée. Vous pouvez sélectionner n'importe quel fichier et il s'ouvrira avec un programme par défaut affecté à ce type de fichier.

entrez la description de l'image ici

4. Code source:

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
la source
c'est cool. vous avez toujours les solutions les plus intéressantes.
@Serg c'est merveilleux. Les balises colleront-elles lorsque je déplacerai les fichiers? Ou lorsque je supprime les fichiers, seront-ils toujours affichés dans les résultats de la recherche?
deshmukh
@deshmukh Non, les balises ne collent pas si vous déplacez les fichiers et les fichiers supprimés apparaissent. Je pourrais implémenter la vérification des fichiers supprimés (assez facilement en fait, ce ne sont que quelques lignes). Essentiellement, vous avez une base de données de balises et de leurs fichiers, et cette base de données doit être maintenue
Sergiy Kolodyazhnyy
@Serg, nous sommes si proches et pourtant si loin. Parce qu'à moins que les balises ne «collent» aux fichiers (donc elles restent même après avoir déplacé le fichier), elles sont aussi bonnes ou aussi mauvaises qu'une structure de répertoires hiérarchiques, sauf qu'un fichier peut avoir plusieurs balises. Je ne dénie pas, même un instant, votre excellent travail. Je dis seulement qu'il ne répond toujours pas à mes besoins (peut-être fous). En outre, comme l'a dit jargonjunkie dans un commentaire séparé, le marquage direct des fichiers pourrait être la solution (comme nous marquons des photographies ou des signets). Mais ce sont les mots d'un novice.
deshmukh
@deshmukh Je suis d'accord, le balisage direct de fichiers serait idéal. Je n'ai tout simplement pas trouvé de moyen de le faire, du moins pas encore. J'ai essayé quelques approches, mais elles n'ont donné aucun résultat. Je pourrais potentiellement faire un script qui vérifie périodiquement si tous les fichiers sont en place, mais c'est le mieux que je puisse faire, qnd il serait très inefficace si le nombre de fichiers augmente dans le fichier de configuration. J'espère que cela peut être utile à certains, mais je suis d'accord - ce n'est pas exactement une solution que vous cherchez
Sergiy Kolodyazhnyy
1

J'ai trouvé un moyen de le faire.

Ouvrez un terminal ( CTRL+ ALT+ T) puis exécutez cette commande:

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

Entrez votre mot de passe et lorsque vous y êtes invité, appuyez sur entrée, puis exécutez

sudo apt-get update

ensuite

sudo apt-get install tracker tracker-gui

Ne vous inquiétez pas s'il indique que c'est déjà la dernière version.

Ouvrez maintenant Nautilus / Files et cliquez avec le bouton droit sur le document auquel vous souhaitez ajouter des balises. Sélectionnez les propriétés, puis sélectionnez l'onglet qui dit "Tags". Entrez une balise dans la zone de texte et appuyez sur Entrée ou cliquez sur le bouton Ajouter pour l'ajouter. Vous pouvez également cliquer sur une balise que vous avez déjà ajoutée et sélectionner le bouton Supprimer pour supprimer une balise. Veuillez noter que les balises sont sensibles à la casse. Les balises que vous créez seront persistantes dans tout le système, vous pouvez donc facilement cocher une balise que vous avez déjà créée pour marquer le fichier au lieu de le taper manuellement à nouveau.

Après avoir marqué les éléments souhaités, vous pouvez maintenant les rechercher, mais pas dans Fichiers. Accédez aux activités et recherchez l'application Desktop Search. Lancez-le et regardez les options en haut. En haut à gauche de la fenêtre, cliquez sur l'icône du dossier avec l'info-bulle "Afficher les résultats par fichiers dans une liste". Maintenant, vous avez plus d'options. Sélectionnez l'option juste à gauche du champ de recherche avec l'info-bulle "Rechercher les critères de recherche dans les balises de fichier uniquement". Vous pouvez maintenant rechercher des tags!

Pour l'utiliser, entrez les balises que vous souhaitez rechercher, séparées par des virgules et appuyez sur Entrée. Par exemple:

Important, septembre, présentation

Cela n'affichera que les fichiers qui ont les trois balises: "Important", "Septembre" et "Présentation".

En double-cliquant sur un, il ouvrira le fichier dans le programme par défaut, et en cliquant avec le bouton droit et en sélectionnant "Afficher le répertoire parent", il ouvrira son emplacement dans Nautilus.

Dans Desktop Search, vous pouvez également cliquer sur le deuxième bouton en partant de la droite en haut de la fenêtre (généralement une étoile ou un cœur) pour modifier les balises dans l'application elle-même!

Voilà! J'espère que cela t'aides. Si vous avez d'autres questions, faites-le moi savoir.

ComputerGuy
la source
0

Réponse courte: ce n'est pas possible nativement dans Ubuntu. Vous avez besoin d'une extension ou d'une base de données de documents, comme suggéré par les autres réponses.

Une autre option que je peux recommander est d'utiliser l'application TagSpaces . Cette application peut enregistrer des balises dans le nom de fichier , ce qui rend le marquage durable et portable. Vous pouvez modifier le nom de fichier dans Nautilus ou dans votre Cloud-Storage et la balise apparaîtra dans TagSpaces et vice versa.

capture d'écran

pixelbrackets
la source