Как я могу пометить файлы и искать их позже по тегу?

15

Запуск Ubuntu Gnome.

У меня есть много PDF и других документов, и я хотел бы отметить их. И искать их позже на основе этих тегов. Даже если я перемещаю файлы в разные папки (т. Е. Теги прикрепляются к файлам).

Я искал, но Файлы и Документы не предоставляют эту опцию.

Я делаю что-то неправильно? Как я могу пометить файлы, чтобы я мог искать их по тегам позже?

Дешмук
источник
Только для добавления тегов в документы PDF часть вопроса (но не для части поиска тегов вопроса) см. Этот ответ
karel
Считаете ли вы "закладкой" файла в качестве опции вместо тегов?
Сергей Колодяжный
@ Серг, мне не ясно. Можешь немного объяснить? Могут ли эти закладки иметь теги, такие как закладки Firefox? Останутся ли они, даже если я переместу файл?
Дешмух
@deshmukh Вот что я делал раньше: askubuntu.com/q/803644/295286 По сути, он создает символическую ссылку на файл внутри папки. С другой стороны, я мог бы реализовать сортировку списка тегов, и для каждого тега был бы список файлов. В настоящее время я несколько занят, поэтому мне нужно отвечать вечно, но я постараюсь выложить ответ как можно скорее. Можно ли будет снова получить награду, как только этот раз закончится?
Сергей Колодяжный
@ Серг Я не достаточно богат, чтобы предложить еще одну награду :) Но если она не принесет выигрыша (это вообще возможно?) И если ваш ответ (когда он придет) будет лучшим, конечно, я предложу награду ты :) :)
Дешмух

Ответы:

9

Содержание:

  1. Вступление
  2. Установка
  3. использование
  4. Исходный код

1. Введение

Это решение состоит из двух сценариев - один для тегирования, другой для чтения списка файлов под определенным тегом. Оба должны жить ~/.local/share/nautilus/scriptsи активироваться с помощью щелчка правой кнопкой мыши в файловом менеджере Nautilus для любого файла и перехода в подменю Scripts. Исходный код для каждого скрипта предоставляется здесь, а также на 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))

Сергей Колодяжный
источник
это здорово. У вас всегда есть самые интересные решения.
@ Серж, это прекрасно. Придерживаются ли теги при перемещении файлов? Или когда я удалю файлы, они все равно будут отображаться в результатах поиска?
Дешмух
@deshmukh Нет, теги не прикрепляются, если вы перемещаете файлы, а удаленные файлы отображаются. Я мог бы реализовать проверку на удаленные файлы (на самом деле это довольно просто, всего несколько строк). По сути, у вас есть база данных тегов и их файлов, и эта база данных должна поддерживаться
Сергей Колодяжный,
@ Серг, мы так близко, но так далеко. Потому что если теги не «прилипают» к файлам (поэтому они остаются даже после перемещения файла), это так же хорошо или плохо, как иерархическая структура каталогов, за исключением того, что один файл может иметь несколько тегов. Я даже на мгновение не умаляю твою превосходную работу. Я только говорю, что это все еще не отвечает моим (может быть, безумным) потребностям. Кроме того, как сказал jargonjunkie в отдельном комментарии, решение проблемы может заключаться в том, чтобы пометить файлы напрямую (например, мы помечаем фотографии или закладки). Но это слова новичка.
Дешмух
@deshmukh Я согласен, тегирование файлов напрямую было бы идеально. Я просто не нашел способ сделать это, по крайней мере пока. Я попробовал несколько подходов, но они не дали никаких результатов. Я мог бы потенциально создать сценарий, который периодически проверяет, все ли файлы на месте, но это лучшее, что я могу сделать, и было бы крайне неэффективно, если количество файлов в конфигурационном файле станет большим. Я надеюсь, что это может быть полезно для некоторых, но я согласен - это не совсем то решение, которое вы ищете
Сергей Колодяжный
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 и щелкните правой кнопкой мыши документ, к которому вы хотите добавить теги. Выберите свойства, затем выберите вкладку с надписью «Теги». Введите тег в текстовое поле и нажмите клавишу ввода или нажмите кнопку «Добавить», чтобы добавить его. Вы также можете щелкнуть тег, который вы уже добавили, и нажать кнопку «Удалить», чтобы удалить тег. Обратите внимание, что теги чувствительны к регистру. Теги, которые вы создаете, будут постоянными во всей системе, поэтому вы можете легко поставить галочку рядом с тегом, который вы уже создали, чтобы пометить файл, вместо того, чтобы вручную вводить его снова.

После того, как вы отметили нужные элементы, вы можете искать их, но не в файлах. Перейти к деятельности, и искать приложениеDesktop Search . Запустите его и посмотрите на варианты сверху. В верхней левой части окна щелкните значок папки с подсказкой «Отображать результаты по файлам в списке». Теперь у вас есть больше вариантов. Выберите опцию слева от окна поиска с помощью всплывающей подсказки «Найти критерии поиска только в тегах файлов». Теперь вы можете искать теги!

Чтобы использовать это, введите теги, которые вы хотите найти, разделенные запятыми и нажмите Enter. Например:

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

Это покажет только файлы, которые имеют все три тега: «Важный», «Сентябрь» и «Презентация».

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

В Desktop Search вы также можете нажать вторую кнопку справа вверху окна (обычно звезду или сердце), чтобы редактировать теги в самом приложении!

Вот оно! Надеюсь это поможет. Если у вас есть еще вопросы, дайте мне знать.

ComputerGuy
источник
0

Краткий ответ: это невозможно в Ubuntu. Вам нужно какое-то расширение или база данных документов, как предлагают другие ответы.

Другой вариант, который я могу порекомендовать, это использовать приложение TagSpaces . Это приложение может сохранять теги в имени файла , что делает тегирование долговечным и переносимым. Вы можете изменить имя файла в Nautilus или в вашем облачном хранилище, и тег появится в TagSpaces и наоборот.

Скриншот

pixelbrackets
источник