Jak mogę oznaczyć pliki i wyszukać je później na podstawie znacznika?


15

Uruchamianie Ubuntu Gnome.

Mam dużo plików PDF i innych dokumentów i chcę je oznaczyć. I przeszukaj je później na podstawie tych tagów. Nawet jeśli przeniosę pliki do różnych folderów (więc tagi przyklejają się do plików).

Szukałem, ale pliki i dokumenty nie zapewniają tej opcji.

czy robię coś źle? Jak mogę oznaczyć pliki, aby móc je później przeszukiwać na podstawie znaczników?


Tylko w przypadku dodawania tagów do dokumentów PDF w części pytania (ale nie w części wyszukiwania w tagach wyszukiwania) zobacz tę odpowiedź
Karel

Czy zamiast dodawania tagów uważa się „dodawanie zakładek” do pliku?
Sergiy Kolodyazhnyy

@Erg Nie jestem pewien. Czy możesz coś wyjaśnić? Czy te zakładki mogą mieć tagi, takie jak zakładki Firefox? Czy pozostaną nawet po przeniesieniu pliku?
deshmukh

@deshmukh Oto co zrobiłem wcześniej: askubuntu.com/q/803644/295286 Zasadniczo tworzy dowiązanie symboliczne do pliku w folderze. Z drugiej strony mogłem zaimplementować rodzaj listy tagów, a dla każdego tagu byłaby lista plików. Obecnie jestem trochę zajęty, więc odpowiedź trwa wieczność, ale spróbuję udzielić odpowiedzi JAK NAJSZYBCIEJ. Czy byłoby możliwe ponowne przyznanie nagrody, gdy ten raz się skończy?
Sergiy Kolodyazhnyy

@Serg Nie jestem wystarczająco bogaty, aby zaoferować kolejną nagrodę :) Ale jeśli to się nie uda, nikt nie wygra (czy to w ogóle możliwe?) I jeśli twoja odpowiedź (jeśli przyjdzie) jest najlepsza, z pewnością zaoferuję nagrodę ty :) :)
deshmukh

Odpowiedzi:


9

Zawartość:

  1. Wprowadzenie
  2. Instalacja
  3. Stosowanie
  4. Kod źródłowy

1. Wstęp

To rozwiązanie składa się z dwóch skryptów - jednego do tagowania, jednego do odczytu listy plików pod określonym tagiem. Oba muszą żyć ~/.local/share/nautilus/scriptsi aktywowane poprzez kliknięcie prawym przyciskiem myszy w menedżerze plików Nautilus na dowolnym pliku i przejście do podmenu Skrypty. Kod źródłowy każdego skryptu znajduje się tutaj, a także na GitHub

2. Instalacja

Oba skrypty muszą być zapisywane ~/.local/share/nautilus/scripts, gdzie ~jest katalog domowy użytkownika, wykonane z wykonywalny chmod +x filename. Aby ułatwić instalację, użyj następującego skryptu 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. Zastosowanie:

Oznaczanie plików :

Wybierz pliki w menedżerze plików Nautilus, kliknij je prawym przyciskiem myszy i przejdź do podmenu Skrypty. Wybierz tag_file.py. Hit Przy Enter wprowadź opis zdjęcia tutaj pierwszym uruchomieniu tego skryptu nie będzie pliku konfiguracyjnego, więc zobaczysz:

wprowadź opis zdjęcia tutaj

Następnym razem, gdy masz już niektóre pliki, zobaczysz wyskakujące okienko, które pozwala wybrać znacznik i / lub dodać nowy (w ten sposób możesz nagrywać pliki pod wieloma znacznikami). Naciśnij, OKaby dodać pliki do tego znacznika. Uwaga : unikaj używania „|” symbol w nazwie znacznika.

wprowadź opis zdjęcia tutaj

Skrypt rejestruje wszystko w ~/.tagged_files. Ten plik jest w zasadzie jsonsłownikiem (nie jest czymś, o co powinni dbać zwykli użytkownicy, ale jest wygodny dla programistów :)). Format tego pliku jest następujący:

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

Jeśli kiedykolwiek chcesz „odznaczyć” jakiś plik, po prostu usuń wpis z tej listy. Zwróć uwagę na format i przecinki.

Wyszukiwanie według tagu :

Teraz, gdy masz ładną ~/.tagged_filesbazę danych plików, możesz albo odczytać ten plik, albo użyć read_tags.pyskryptu.

Kliknij prawym przyciskiem myszy dowolny plik w Nautilusie (naprawdę nie ma znaczenia, który) read_tags.py. Wybierz . TrafienieEnter wprowadź opis zdjęcia tutaj

Zobaczysz wyskakujące okienko z pytaniem, który tag chcesz wyszukać:

wprowadź opis zdjęcia tutaj

Wybierz jeden, kliknij OK. Zobaczysz okno dialogowe z listą, w którym chcesz znaleźć pliki dla wybranego znacznika. Możesz wybrać dowolny pojedynczy plik, a otworzy się on z domyślnym programem przypisanym do tego typu pliku.

wprowadź opis zdjęcia tutaj

4. Kod źródłowy:

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


to jest fajne. zawsze masz najciekawsze rozwiązania.

@Erg to jest cudowne. Czy tagi pozostaną przy przenoszeniu plików? Czy po usunięciu plików będą one nadal wyświetlane w wynikach wyszukiwania?
deshmukh

@deshmukh Nie, tagi nie przyklejają się, gdy przenosisz pliki, a usunięte pliki są wyświetlane. Mogę zaimplementować sprawdzanie usuniętych plików (całkiem łatwo, to tylko kilka wierszy). Zasadniczo masz bazę danych znaczników i ich plików, i ta baza danych musi być utrzymywana
Sergiy Kolodyazhnyy

@Serg, jesteśmy jeszcze tak blisko. Ponieważ chyba, że ​​tagi w pewnym sensie „przyklejają się” do plików (więc pozostają one nawet po przeniesieniu pliku), jest ono tak dobre lub złe, jak hierarchiczna struktura katalogów, z tym wyjątkiem, że jeden plik może mieć wiele tagów. Nawet przez chwilę nie umniejszam waszej doskonałej pracy. Mówię tylko, że nadal nie zaspokaja moich (być może, szalonych) potrzeb. Ponadto, jak powiedział jargonjunkie w osobnym komentarzu, rozwiązaniem może być bezpośrednie tagowanie plików (np. Oznaczanie zdjęć lub zakładek). Ale to są słowa nowicjusza.
deshmukh

@deshmukh Zgadzam się, bezpośrednie oznaczanie plików byłoby idealne. Po prostu nie znalazłem sposobu, by to zrobić, przynajmniej jeszcze. Próbowałem kilku podejść, ale nie przyniosły żadnych rezultatów. Mógłbym potencjalnie stworzyć skrypt, który okresowo sprawdza, czy wszystkie pliki są na miejscu, ale to najlepsze, co mogę zrobić, i byłoby wysoce nieefektywne, gdyby liczba plików wzrosła w pliku konfiguracyjnym. Mam nadzieję, że może to być przydatne dla niektórych, ale zgadzam się - nie jest to dokładnie rozwiązanie, którego szukasz
Sergiy Kolodyazhnyy

1

Znalazłem sposób, aby to zrobić.

Otwórz terminal ( CTRL+ ALT+ T), a następnie uruchom następujące polecenie:

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

Wprowadź hasło, a po wyświetleniu monitu naciśnij enter, a następnie uruchom

sudo apt-get update

następnie

sudo apt-get install tracker tracker-gui

Nie martw się, jeśli powie, że to już najnowsza wersja.

Teraz otwórz Nautilus / Files i kliknij prawym przyciskiem myszy dokument, do którego chcesz dodać tagi. Wybierz właściwości, a następnie wybierz kartę „Tagi”. Wpisz znacznik w polu tekstowym i naciśnij enter lub kliknij przycisk Dodaj, aby go dodać. Możesz także kliknąć tag, który już dodałeś i wybrać przycisk Usuń, aby usunąć tag. Pamiętaj, że w tagach rozróżniana jest wielkość liter. Tagi, które utworzysz, będą trwałe w całym systemie, dzięki czemu możesz łatwo umieścić zaznaczenie obok tagu, który już utworzyłeś, aby oznaczyć plik zamiast ręcznie go pisać.

Po oznaczeniu potrzebnych elementów możesz je teraz wyszukiwać, ale nie w folderze Pliki. Przejdź do działań i wyszukaj aplikację Desktop Search. Uruchom go i spójrz na opcje u góry. W lewej górnej części okna kliknij ikonę folderu z etykietą „Wyświetl wyniki według plików na liście”. Teraz masz więcej opcji. Wybierz opcję po lewej stronie pola wyszukiwania z podpowiedzią „Znajdź kryteria wyszukiwania tylko w tagach plików”. Teraz możesz wyszukiwać tagi!

Aby tego użyć, wprowadź tagi, które chcesz wyszukać, oddzielając je przecinkami i naciśnij enter. Na przykład:

Ważne, wrzesień, prezentacja

Spowoduje to wyświetlenie tylko plików, które mają wszystkie trzy tagi: „Ważne”, „Wrzesień” i „Prezentacja”.

Dwukrotne kliknięcie jednego spowoduje otwarcie pliku w domyślnym programie, a kliknięcie prawym przyciskiem myszy i wybranie „Pokaż katalog macierzysty” spowoduje otwarcie jego lokalizacji w Nautilusie.

W wyszukiwaniu pulpitu możesz także kliknąć drugi przycisk z prawej strony u góry okna (zwykle gwiazdkę lub serce), aby edytować tagi w samej aplikacji!

Masz to! Mam nadzieję że to pomoże. Jeśli masz więcej pytań, daj mi znać.


0

Krótka odpowiedź: w Ubuntu nie jest to możliwe. Potrzebujesz rozszerzenia lub bazy danych dokumentów, jak sugerują inne odpowiedzi.

Inną opcją, którą mogę polecić, jest użycie aplikacji TagSpaces . Ta aplikacja może zapisywać tagi w nazwie pliku , dzięki czemu tagowanie jest trwałe i przenośne. Możesz edytować nazwę pliku w Nautilus lub w chmurze, a tag pojawi się w TagSpaces i odwrotnie.

zrzut ekranu

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.