Wie kann ich Dateien taggen und sie später anhand des Tags durchsuchen?

14

Ubuntu Gnome ausführen.

Ich habe viele PDF- und andere Dokumente und möchte sie mit Tags versehen. Und sie später anhand dieser Tags durchsuchen. Auch wenn ich die Dateien in andere Ordner verschiebe (so bleiben die Tags bei den Dateien).

Ich habe gesucht, aber Dateien und Dokumente bieten diese Optionen nicht an.

Mache ich etwas falsch? Wie kann ich Dateien mit Tags versehen, damit ich sie später anhand von Tags durchsuchen kann?

Deshmukh
quelle
Nur für das Hinzufügen von Tags zu PDF-Dokumenten, die Teil der Frage sind (aber nicht für das Hinzufügen von Tags zu PDF-Dokumenten, die Teil der Frage sind), finden Sie diese Antwort
karel
Würden Sie in Betracht ziehen, eine Datei mit einem Lesezeichen zu versehen, anstatt sie zu markieren?
Sergiy Kolodyazhnyy
@ Serg bin mir nicht klar. Kannst du ein bisschen erklären? Können diese Lesezeichen Tags wie Firefox-Lesezeichen enthalten? Bleiben sie auch dann erhalten, wenn ich die Datei verschiebe?
Deshmukh
@deshmukh Folgendes habe ich bereits getan: askubuntu.com/q/803644/295286 Im Grunde wird ein Symlink zur Datei in einem Ordner erstellt. Andererseits könnte ich eine Art Liste von Tags implementieren, und für jedes Tag würde es eine Liste von Dateien geben. Momentan bin ich etwas beschäftigt, daher brauche ich ewig, um zu antworten, aber ich werde versuchen, die Antwort so schnell wie möglich zu löschen. Wäre es möglich, das Kopfgeld noch einmal auszuschütten?
Sergiy Kolodyazhnyy
@ Serg Ich bin nicht reich genug, um ein weiteres Kopfgeld anzubieten :) Aber wenn dieses ohne Gewinn geht (ist das überhaupt möglich?) Und wenn deine Antwort (wenn sie kommt) die beste ist, werde ich das Kopfgeld anbieten Sie :) :)
deshmukh

Antworten:

9

Inhalt:

  1. Einführung
  2. Installation
  3. Verwendung
  4. Quellcode

1. Einleitung

Diese Lösung besteht aus zwei Skripten - eines zum Markieren und eines zum Lesen der Liste der Dateien unter einem bestimmten Tag. Beide müssen ~/.local/share/nautilus/scriptsim Nautilus-Dateimanager mit der rechten Maustaste auf eine Datei klicken und diese aktivieren und zum Untermenü „Skripte“ navigieren. Der Quellcode für jedes Skript wird hier sowie auf GitHub bereitgestellt

2. Installation

Beide Skripte werden müssen , gespeichert ~/.local/share/nautilus/scripts, wo ~sich Home - Verzeichnis des Benutzers und mit ausführbar gemacht chmod +x filename. Verwenden Sie zur einfachen Installation das folgende Bash-Skript:

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

Dateien markieren :

Wählen Sie Dateien im Nautilus-Dateimanager aus, klicken Sie mit der rechten Maustaste darauf und navigieren Sie zum Untermenü Skripts. Auswählen tag_file.py. Wenn Enter Bildbeschreibung hier eingeben Sie dieses Skript zum ersten Mal ausführen, ist keine Konfigurationsdatei vorhanden. Sie sehen also Folgendes:

Bildbeschreibung hier eingeben

Wenn Sie das nächste Mal bereits Dateien mit Tags versehen haben, wird ein Popup-Fenster angezeigt, in dem Sie ein Tag auswählen und / oder ein neues hinzufügen können (auf diese Weise können Sie Dateien unter mehreren Tags aufzeichnen). Klicken Sie OKauf, um Dateien zu diesem Tag hinzuzufügen. Hinweis : Vermeiden Sie "|" Symbol im Tag-Namen.

Bildbeschreibung hier eingeben

Das Skript zeichnet alles auf ~/.tagged_files. Diese Datei ist im Wesentlichen ein jsonWörterbuch (was nicht für normale Benutzer wichtig ist, aber für Programmierer praktisch :)). Das Format dieser Datei ist wie folgt:

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

Wenn Sie jemals eine Datei "entmarkieren" möchten, löschen Sie einfach einen Eintrag aus dieser Liste. Beachten Sie das Format und die Kommas.

Suche nach Tag :

Jetzt, da Sie eine schöne ~/.tagged_filesDatenbank mit Dateien haben, können Sie diese Datei entweder lesen oder ein read_tags.pySkript verwenden.

Klicken Sie mit der rechten Maustaste auf eine beliebige Datei in Nautilus (egal welche) read_tags.py. SchlagenEnter Bildbeschreibung hier eingeben

Sie werden in einem Popup gefragt, nach welchem ​​Tag Sie suchen möchten:

Bildbeschreibung hier eingeben

Wählen Sie einen aus und klicken Sie auf OK. Sie sehen ein Listendialogfeld, in dem angezeigt wird, dass die gewünschten Dateien für das ausgewählte Tag vorhanden sind. Sie können eine einzelne Datei auswählen, die mit einem Standardprogramm geöffnet wird, das diesem Dateityp zugewiesen ist.

Bildbeschreibung hier eingeben

4. Quellcode:

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
quelle
das ist cool. Sie haben immer die interessantesten Lösungen.
@ Serg das ist wunderbar. Bleiben die Tags beim Verschieben der Dateien erhalten? Oder werden die gelöschten Dateien weiterhin in den Suchergebnissen angezeigt?
Deshmukh
@deshmukh Nein, die Tags bleiben nicht erhalten, wenn Sie die Dateien verschieben, und gelöschte Dateien werden angezeigt. Ich könnte die Suche nach gelöschten Dateien implementieren (eigentlich ganz einfach, es sind nur ein paar Zeilen). Im Wesentlichen haben Sie eine Datenbank mit Tags und ihren Dateien, und diese Datenbank muss gepflegt werden
Sergiy Kolodyazhnyy
@ Serg wir sind so nah und doch so fern. Denn es sei denn, die Tags bleiben bei den Dateien (so dass sie auch nach dem Verschieben der Datei erhalten bleiben), sind sie so gut oder so schlecht wie eine hierarchische Verzeichnisstruktur, mit der Ausnahme, dass eine Datei mehrere Tags haben kann. Ich werde Ihre hervorragende Arbeit nicht einmal für einen Moment herabsetzen. Ich sage nur, dass es immer noch nicht meine (möglicherweise verrückten) Bedürfnisse anspricht. Auch, wie Jargonjunkie in einem separaten Kommentar sagte, könnte das direkte Markieren der Dateien die Lösung sein (wie wir Fotos oder Lesezeichen markieren). Aber das sind die Worte eines Neulings.
Deshmukh
@deshmukh Ich stimme zu, das direkte Markieren von Dateien wäre ideal. Ich habe einfach noch keinen Weg gefunden, zumindest noch nicht. Ich habe ein paar Ansätze ausprobiert, aber sie haben keine Ergebnisse geliefert. Ich könnte möglicherweise ein Skript erstellen, das regelmäßig überprüft, ob alle Dateien vorhanden sind, aber das ist das Beste, was ich tun kann, und es wäre äußerst ineffizient, wenn die Anzahl der Dateien in der Konfigurationsdatei größer würde. Ich hoffe, dass dies für einige nützlich sein kann, aber ich stimme zu - das ist nicht genau die Lösung, die Sie suchen
Sergiy Kolodyazhnyy
1

Ich habe einen Weg gefunden, dies zu tun.

Öffne ein Terminal ( CTRL+ ALT+ T) und führe dann den folgenden Befehl aus:

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

Geben Sie Ihr Passwort ein und drücken Sie bei Aufforderung die Eingabetaste und führen Sie dann aus

sudo apt-get update

dann

sudo apt-get install tracker tracker-gui

Mach dir keine Sorgen, wenn es heißt, es ist bereits die neueste Version.

Öffnen Sie nun Nautilus / Files und klicken Sie mit der rechten Maustaste auf das Dokument, dem Sie Tags hinzufügen möchten. Wählen Sie Eigenschaften und dann die Registerkarte "Tags". Geben Sie ein Tag in das Textfeld ein und drücken Sie die Eingabetaste oder klicken Sie auf die Schaltfläche Hinzufügen, um es hinzuzufügen. Sie können auch auf ein bereits hinzugefügtes Tag klicken und auf die Schaltfläche Entfernen klicken, um ein Tag zu entfernen. Bitte beachten Sie, dass bei Tags zwischen Groß- und Kleinschreibung unterschieden wird. Die Tags, die Sie erstellen, bleiben im gesamten System erhalten, sodass Sie die bereits erstellten Tags einfach mit einem Häkchen versehen können, um die Datei zu markieren, anstatt sie erneut manuell einzugeben.

Nachdem Sie die gewünschten Elemente markiert haben, können Sie nach ihnen suchen, jedoch nicht in Dateien. Gehen Sie zu Aktivitäten und suchen Sie nach der App Desktop Search. Starten Sie es und sehen Sie sich die Optionen oben an. Klicken Sie oben links im Fenster auf das Ordnersymbol mit der QuickInfo "Ergebnisse nach Dateien in einer Liste anzeigen". Jetzt haben Sie mehr Möglichkeiten. Wählen Sie die Option links neben dem Suchfeld mit dem Tooltipp "Suchkriterien nur in Datei-Tags suchen". Jetzt können Sie nach Tags suchen!

Geben Sie dazu die Tags ein, nach denen Sie suchen möchten, und drücken Sie die Eingabetaste. Beispielsweise:

Wichtig, September, Präsentation

Dies zeigt nur Dateien an, die alle drei Tags enthalten: "Important", "September" und "Presentation".

Durch Doppelklicken wird die Datei im Standardprogramm geöffnet, und durch Klicken mit der rechten Maustaste und Auswahl von "Show Parent Directory" wird der Speicherort in Nautilus geöffnet.

In der Desktopsuche können Sie auch auf die zweite Schaltfläche von rechts oben im Fenster klicken (normalerweise ein Stern oder ein Herz), um Tags in der App selbst zu bearbeiten!

Hier hast du es! Hoffe das hilft. Wenn Sie weitere Fragen haben, lassen Sie es mich wissen.

ComputerGuy
quelle