Як я можу позначити файли та шукати їх пізніше на основі тегу?


15

Запуск Ubuntu Gnome.

У мене дуже багато PDF та інших документів, і мені хотілося б позначити їх. І пізніше шукайте їх на основі цих тегів. Навіть якщо я переміщую файли до різних папок (значить, теги дотримуються файлів).

Я шукав, але файли та документи не пропонують цієї опції.

Я щось роблю не так? Як я можу позначити файли, щоб пізніше їх шукати на основі тегів?


Що стосується лише додавання тегів до PDF-файлів, частини запитання (але не пошукових тегів, що є частиною питання), дивіться цю відповідь
karel

Чи розглядаєте ви "закладку" файлу як варіант замість тегів?
Сергій Колодяжний

@ Серг Мені не ясно. Ви можете трохи пояснити? Чи можуть ці закладки мати теги, як закладки Firefox? Чи залишаться вони, навіть якщо я переміщу файл?
дешмух

@deshmukh Ось що я робив раніше: askubuntu.com/q/803644/295286 В основному це створює символьне посилання на файл всередині папки. З іншого боку, я міг би реалізувати свого роду список тегів, і для кожного тегу був би список файлів. В даний час я дещо зайнятий, тому мені потрібно вічно відповідати, але я спробую викласти відповідь якомога швидше. Чи можна було б повернути ще раз один раз цей раз?
Сергій Колодяжний

@ Серг, я недостатньо багатий, щоб запропонувати ще одну винагороду :) Але якщо ця буде без жодного виграшу (це можливо навіть?), І якщо ваша відповідь (коли вона з'явиться) найкраща, я впевнений, я запропону винагороду ти :) :)
дешмух

Відповіді:


9

Зміст:

  1. Вступ
  2. Установка
  3. Використання
  4. Вихідний код

1. Введення

Це рішення складається з двох скриптів - один для тегування, один для читання списку файлів під певним тегом. Обоє мають жити ~/.local/share/nautilus/scriptsта активуватися за допомогою правої кнопки миші в файловому менеджері Nautilus на будь-якому файлі та навігації до підменю Скрипти. Вихідний код для кожного сценарію надається тут, а також на GitHub

2. Установка

Обидва сценарії повинні бути збережені в ~/.local/share/nautilus/scripts, де ~знаходиться домашній каталог користувача, і зробити його виконуваним chmod +x filename. Для зручної установки використовуйте наступний скрипт 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. Використання:

Позначення файлів :

Виберіть файли в файловому менеджері Nautilus, клацніть правою кнопкою миші на них та перейдіть до підменю Сценарії. Виберіть tag_file.py. Натисніть Enter введіть тут опис зображення Перший раз, коли ви запустите цей скрипт, файл конфігурації не буде, тому ви побачите це:

введіть тут опис зображення

Наступного разу, коли у вас уже позначені деякі файли, ви побачите спливаюче вікно, яке дозволяє вибрати тег та / або додати новий (таким чином ви можете записувати файли під кількома тегами). Натисніть, OKщоб додати файли до цього тегу. Примітка . Уникайте "|" символ у назві тегу.

введіть тут опис зображення

Сценарій записує все в ~/.tagged_files. Цей файл по суті є jsonсловником (що не те, про що регулярні користувачі повинні дбати, але це зручно для програмістів :)). Формат цього файлу такий:

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

Якщо ви хочете коли-небудь "відмітити" якийсь файл, просто видаліть запис із цього списку. Зверніть увагу на формат і коми.

Пошук за тегом :

Тепер, коли у вас є приємна ~/.tagged_filesбаза даних файлів, ви можете прочитати цей файл або скористатися read_tags.pyскриптом.

Клацніть правою кнопкою миші на будь-якому файлі в Nautilus (насправді не важливо, який) .Виберіть read_tags.py. УдарEnter введіть тут опис зображення

Ви побачите спливаюче вікно, яке запитає вас, який тег ви хочете шукати:

введіть тут опис зображення

Виберіть його та натисніть OK. Ви побачите діалогове вікно списку, яке показує, що потрібні файли для вибраного тегу. Ви можете вибрати будь-який окремий файл, і він відкриється програмою за замовчуванням, призначеною для цього типу файлів.

введіть тут опис зображення

4. Вихідний код:

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


це круто. у вас завжди є найцікавіші рішення.

@Serg це чудово. Чи приклеюються теги, коли я переміщу файли? Або коли я видалю файли, вони все ще відображатимуться в результатах пошуку?
дешмух

@deshmukh Ні, теги не приклеюються, якщо ви переміщуєте файли, а видалені файли відображаються. Я міг би здійснити перевірку видалених файлів (насправді досить просто, це лише кілька рядків). По суті, у вас є база даних тегів та їх файлів, і цю базу даних потрібно підтримувати
Сергій Колодяжний

@ Серг, ми так близько, поки що поки що. Оскільки, якщо теги не «прилипають» до файлів (тому вони залишаються навіть після переміщення файлу), це так само добре або погано, як ієрархічна структура каталогів, за винятком того, що один файл може мати кілька тегів. Я навіть не на мить не принижую вашу чудову роботу. Я лише кажу, що це все ще не відповідає моїм (можливо, шаленим) потребам. Також, як сказано в окремому коментарі jargonjunkie, рішенням може бути тег до файлів безпосередньо (як ми тегуємо фотографії або закладки). Але це слова новачка.
дешмух

@deshmukh Я згоден, позначення файлів безпосередньо було б ідеальним. Я просто не знайшов способу зробити це, хоча б. Я спробував кілька підходів, але вони не дали жодних результатів. Я потенційно міг би зробити сценарій, який періодично перевіряє, чи всі файли на своєму місці, але це найкраще, що я можу зробити, qnd це було б дуже неефективно, якщо кількість файлів у файлі config зростає. Я сподіваюся, що це може бути корисним для деяких, але я згоден - це не саме рішення, яке ви шукаєте
Сергій Колодяжний

1

Я знайшов спосіб це зробити.

Відкрийте термінал ( CTRL+ ALT+ T) і запустіть цю команду:

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

Введіть свій пароль і, коли буде запропоновано, натисніть клавішу Enter, а потім запустіть

sudo apt-get update

потім

sudo apt-get install tracker tracker-gui

Не хвилюйтесь, якщо там написано, що це вже остання версія.

Тепер відкрийте Nautilus / Files та клацніть правою кнопкою миші документ, до якого потрібно додати теги. Виберіть властивості, а потім виберіть вкладку з написом "Теги". Введіть тег у текстове поле і натисніть клавішу Enter або натисніть кнопку Додати, щоб додати його. Ви також можете натиснути тег, який ви вже додали, і вибрати кнопку Видалити, щоб видалити тег. Зверніть увагу, що теги залежать від регістру. Створені вами теги будуть стійкими у всій системі, тому ви можете легко поставити галочку поруч із створеним вами тегом, щоб позначити файл, а не знову вводити його вручну.

Після позначення потрібних елементів ви можете шукати їх, але не у файлах. Перейдіть до заходів та шукайте додаток Desktop Search. Запустіть його і подивіться варіанти вгорі. У верхній лівій частині вікна натисніть на значок папки з підказкою інструменту "Відображення результатів за файлами у списку". Тепер у вас є більше варіантів. Виберіть параметр зліва від поля пошуку з підказкою "Знайти критерії пошуку лише у тегах файлів". Тепер ви можете шукати теги!

Для цього введіть теги, які ви хочете шукати, відокремте комами та натисніть клавішу Enter. Наприклад:

Важливо, вересень, презентація

Це покаже лише файли, які містять усі три теги: "Важливо", "Вересень" та "Презентація".

Двічі клацнувши по одному, він відкриє файл у програмі за замовчуванням, а правою кнопкою миші та вибором пункту «Показати батьківський каталог» відкриється його місцезнаходження в Nautilus.

У пошуку на робочому столі ви також можете натиснути другу кнопку праворуч у верхній частині вікна (як правило, зірку чи серце), щоб редагувати теги в самому додатку!

Там у вас є! Сподіваюсь, це допомагає. Якщо у вас є якісь питання, повідомте мене.


0

Коротка відповідь: Це неможливо спочатку в Ubuntu. Вам потрібне розширення або база даних документів, як пропонують інші відповіді.

Ще одним варіантом, який я можу порекомендувати, є використання програми TagSpaces . Ця програма може зберігати теги у назві файлу , що робить теги міцними та портативними. Ви можете редагувати ім'я файлу в Nautilus або у вашому Cloud-Storage, і тег з’явиться в TagSpaces і навпаки.

скріншот

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.