Làm cách nào tôi có thể gắn thẻ các tệp và tìm kiếm chúng sau này dựa trên thẻ?


15

Chạy Ubuntu Gnome.

Tôi có rất nhiều PDF và các tài liệu khác và tôi muốn gắn thẻ chúng. Và tìm kiếm chúng sau này dựa trên các thẻ này. Ngay cả khi tôi di chuyển các tệp vào các thư mục khác nhau (vì vậy, các thẻ dính vào các tệp).

Tôi đã tìm kiếm nhưng Tệp và Tài liệu không cung cấp tùy chọn này.

Tôi có làm điều gì sai? Làm cách nào tôi có thể gắn thẻ các tệp để tôi có thể tìm kiếm chúng dựa trên các thẻ sau?


Chỉ để thêm thẻ vào tài liệu PDF một phần của câu hỏi (chứ không phải phần thẻ tìm kiếm của câu hỏi), hãy xem câu trả lời này
karel

Bạn có xem xét "đánh dấu" một tập tin là tùy chọn thay vì gắn thẻ không?
Sergiy Kolodyazhnyy

@Serg Tôi không rõ. Bạn có thể giải thích một chút? Những dấu trang này có thể có các thẻ như dấu trang Firefox không? Họ sẽ vẫn còn ngay cả khi tôi di chuyển các tập tin?
deshmukh

@deshmukh Đây là những gì tôi đã làm trước đây: askubfox.com/q/803644/295286 Về cơ bản, nó tạo ra một liên kết tượng trưng để tập tin trong một thư mục. Mặt khác, tôi có thể triển khai loại danh sách các thẻ và đối với mỗi thẻ sẽ có danh sách các tệp. Hiện tại tôi hơi bận, vì vậy tôi phải trả lời mãi mãi, nhưng tôi sẽ cố gắng đưa ra câu trả lời càng sớm càng tốt. Có thể đặt tiền thưởng một lần nữa một lần này không?
Sergiy Kolodyazhnyy

@Serg Tôi không đủ giàu để cung cấp một tiền thưởng khác :) Nhưng nếu điều này xảy ra mà không có ai giành được nó (điều đó thậm chí có thể không?) Và nếu câu trả lời của bạn (khi nó đến) là tốt nhất, chắc chắn, tôi sẽ cung cấp tiền thưởng cho bạn :) :)
deshmukh

Câu trả lời:


9

Nội dung:

  1. Giới thiệu
  2. Cài đặt
  3. Sử dụng
  4. Mã nguồn

1. Giới thiệu

Giải pháp này bao gồm hai tập lệnh - một để gắn thẻ, một để đọc danh sách các tệp theo thẻ cụ thể. Cả hai phải sống ở~/.local/share/nautilus/scripts và kích hoạt thông qua nhấp chuột phải vào trình quản lý tệp Nautilus trên bất kỳ tệp nào và điều hướng đến menu con ScScript. Mã nguồn cho mỗi tập lệnh được cung cấp tại đây cũng như trên GitHub

2. Cài đặt

Cả hai tập lệnh phải được lưu vào ~/.local/share/nautilus/scripts, ~thư mục chính của người dùng và được thực thi với chmod +x filename. Để cài đặt dễ dàng, hãy sử dụng tập lệnh bash sau:

#!/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. Cách sử dụng:

Gắn thẻ tập tin :

Chọn các tệp trong trình quản lý tệp Nautilus, nhấp chuột phải vào chúng và điều hướng đến menu con ScScript. Chọn tag_file.py. Hit Enter nhập mô tả hình ảnh ở đây Lần đầu tiên bạn chạy kịch bản này, sẽ không có tập tin cấu hình, do đó bạn sẽ thấy điều này:

nhập mô tả hình ảnh ở đây

Lần tới, khi bạn đã có một số tệp được gắn thẻ, bạn sẽ thấy một cửa sổ bật lên cho phép bạn chọn một thẻ và / hoặc thêm một tệp mới (theo cách này bạn có thể ghi tệp dưới nhiều thẻ). Nhấn OKđể thêm tập tin vào thẻ này. Lưu ý : Tránh có "|" biểu tượng trong tên thẻ.

nhập mô tả hình ảnh ở đây

Kịch bản ghi lại mọi thứ trong ~/.tagged_files. Tập tin đó thực chất là một jsoncuốn từ điển (không phải là thứ mà người dùng thông thường nên quan tâm, nhưng nó thuận tiện cho các lập trình viên :)). Định dạng của tập tin đó là như vậy:

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

Nếu bạn muốn "bỏ chặn" một số tệp, chỉ cần xóa một mục khỏi danh sách đó. Nhớ định dạng và dấu phẩy.

Tìm kiếm theo thẻ :

Bây giờ bạn có một ~/.tagged_filescơ sở dữ liệu tốt về các tệp, bạn có thể đọc tệp đó hoặc sử dụng read_tags.pytập lệnh.

Nhấp chuột phải vào bất kỳ tệp nào trong Nautilus (thực sự không quan trọng) read_tags.py. Chọn . ĐánhEnter nhập mô tả hình ảnh ở đây

Bạn sẽ thấy một cửa sổ bật lên hỏi bạn muốn tìm kiếm thẻ nào:

nhập mô tả hình ảnh ở đây

Chọn một, nhấp vào OK. Bạn sẽ thấy một hộp thoại danh sách hiển thị bạn muốn có tệp cho thẻ bạn đã chọn. Bạn có thể chọn bất kỳ tệp nào và nó sẽ mở với một chương trình mặc định được gán cho loại tệp đó.

nhập mô tả hình ảnh ở đây

4. Mã nguồn:

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


cái này thật tuyệt bạn luôn có những giải pháp thú vị nhất

@Serg này thật tuyệt vời. Các thẻ sẽ dính khi tôi di chuyển các tập tin? Hoặc khi tôi xóa các tệp, chúng vẫn sẽ hiển thị trong kết quả tìm kiếm chứ?
deshmukh

@deshmukh Không, các thẻ không dính nếu bạn di chuyển các tệp và các tệp bị xóa sẽ hiển thị. Tôi có thể thực hiện kiểm tra các tệp đã bị xóa (thực ra khá dễ dàng, đó chỉ là một vài dòng). Về cơ bản, bạn có một cơ sở dữ liệu về các thẻ và các tệp của chúng, cơ sở dữ liệu này phải được duy trì
Sergiy Kolodyazhnyy

@Serg chúng tôi rất gần nhưng cho đến nay. Bởi vì trừ khi các loại thẻ 'dính' vào các tệp (vì vậy chúng vẫn tồn tại ngay cả sau khi di chuyển tệp xung quanh), nó cũng tốt hoặc xấu như cấu trúc thư mục phân cấp ngoại trừ một tệp có thể có nhiều thẻ. Tôi không, thậm chí trong một khoảnh khắc, coi thường công việc tuyệt vời của bạn. Tôi chỉ nói rằng nó vẫn không giải quyết được nhu cầu (có thể là điên rồ) của tôi. Ngoài ra, như jargonjunkie đã nói trong một bình luận riêng biệt, có thể việc gắn thẻ trực tiếp các tệp có thể là giải pháp (như chúng tôi gắn thẻ ảnh hoặc dấu trang). Nhưng đây là những lời của một người mới.
deshmukh

@deshmukh Tôi đồng ý, gắn thẻ trực tiếp các tệp sẽ là lý tưởng. Tôi chỉ đơn giản là không tìm thấy một cách để làm như vậy, ít nhất là chưa. Tôi đã thử một vài cách tiếp cận, nhưng chúng không mang lại kết quả nào. Tôi có khả năng có thể tạo một tập lệnh kiểm tra định kỳ nếu tất cả các tệp được đặt đúng chỗ, nhưng đó là cách tốt nhất tôi có thể làm, vì nó sẽ không hiệu quả nếu số lượng tệp tăng lên trong tệp cấu hình. Tôi hy vọng điều này có thể hữu ích với một số người, nhưng tôi đồng ý - đây không chính xác là một giải pháp bạn đang tìm kiếm
Sergiy Kolodyazhnyy

1

Tôi đã tìm thấy một cách để làm điều này.

Mở một thiết bị đầu cuối ( CTRL+ ALT+ T) và sau đó chạy lệnh này:

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

Nhập mật khẩu của bạn và khi Nhắc, nhấn enter, sau đó chạy

sudo apt-get update

sau đó

sudo apt-get install tracker tracker-gui

Đừng lo lắng nếu nó nói nó đã là phiên bản mới nhất.

Bây giờ hãy mở Nautilus / Files và nhấp chuột phải vào tài liệu bạn muốn thêm thẻ vào. Chọn thuộc tính, sau đó chọn tab có nội dung "Thẻ". Nhập một thẻ vào hộp văn bản và nhấn enter hoặc nhấp vào nút Thêm để thêm nó. Bạn cũng có thể nhấp vào thẻ bạn đã thêm và chọn nút Xóa để xóa thẻ. Xin lưu ý rằng các thẻ là trường hợp nhạy cảm. Các thẻ bạn tạo sẽ tồn tại trong toàn hệ thống, vì vậy bạn có thể dễ dàng đặt một kiểm tra bên cạnh một thẻ bạn đã tạo để đánh dấu tệp thay vì đánh máy lại theo cách thủ công.

Sau khi gắn thẻ các mục mong muốn, bây giờ bạn có thể tìm kiếm chúng, nhưng không có trong Tệp. Đi đến các hoạt động và tìm kiếm ứng dụngDesktop Search . Khởi chạy nó, và nhìn vào các tùy chọn ở trên cùng. Ở phía trên bên trái của Cửa sổ, nhấp vào biểu tượng thư mục với mẹo công cụ "Hiển thị kết quả theo tệp trong danh sách". Bây giờ bạn có nhiều lựa chọn hơn. Chọn tùy chọn ở bên trái hộp tìm kiếm với mẹo công cụ "Chỉ tìm tiêu chí tìm kiếm trong thẻ tệp". Bây giờ bạn có thể tìm kiếm các thẻ!

Để sử dụng, nhập các thẻ bạn muốn tìm kiếm, phân tách bằng dấu phẩy và nhấn enter. Ví dụ:

Quan trọng, tháng 9, thuyết trình

Điều này sẽ chỉ hiển thị các tệp có cả ba thẻ: "Quan trọng", "Tháng 9" và "Trình bày".

Bằng cách nhấp đúp vào một, nó sẽ mở tệp trong chương trình mặc định và bằng cách nhấp chuột phải và chọn "Hiển thị thư mục gốc", nó sẽ mở vị trí của nó trong Nautilus.

Trong Tìm kiếm trên màn hình, bạn cũng có thể nhấp vào nút thứ hai từ bên phải ở đầu cửa sổ (thường là ngôi sao hoặc trái tim) để chỉnh sửa các thẻ trong chính ứng dụng!

Có bạn có nó! Hi vọng điêu nay co ich. Nếu như bạn có thêm câu hỏi gì, hãy cho tôi biết.


0

Câu trả lời ngắn: Điều này không thể thực sự có trong Ubuntu. Bạn cần một số phần mở rộng hoặc cơ sở dữ liệu tài liệu, như được đề xuất bởi các câu trả lời khác.

Một tùy chọn khác tôi có thể khuyên dùng là sử dụng ứng dụng TagSpaces . Ứng dụng này có thể lưu các thẻ trong tên tệp , giúp gắn thẻ bền và di động. Bạn có thể chỉnh sửa tên tệp trong Nautilus hoặc trong Cloud-Storage của mình và thẻ sẽ xuất hiện trong TagSpaces và ngược lại.

ảnh chụp màn hình

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.