Bagaimana saya bisa menandai file dan mencarinya nanti berdasarkan tag?

15

Menjalankan Ubuntu Gnome.

Saya punya banyak PDF dan dokumen lain dan saya ingin menandai mereka. Dan cari nanti berdasarkan tag ini. Bahkan jika saya memindahkan file ke folder yang berbeda (jadi, tag menempel ke file).

Saya mencari tetapi File dan Dokumen tidak memberikan opsi ini.

Apakah saya melakukan sesuatu yang salah? Bagaimana saya bisa menandai file sehingga saya bisa mencari mereka berdasarkan tag nanti?

deshmukh
sumber
Untuk hanya menambahkan tag ke dokumen PDF bagian dari pertanyaan (tetapi bukan tag pencarian bagian dari pertanyaan) lihat jawaban ini
karel
Apakah Anda akan mempertimbangkan "menandai" file sebagai opsi alih-alih pemberian tag?
Sergiy Kolodyazhnyy
@Serg aku tidak jelas. Bisakah Anda jelaskan sedikit? Bisakah bookmark ini memiliki tag seperti penanda Firefox? Apakah mereka akan tetap ada walaupun saya memindahkan file?
deshmukh
@deshmukh Inilah yang telah saya lakukan sebelumnya: askubuntu.com/q/803644/295286 Pada dasarnya ini menciptakan symlink ke file di dalam folder. Di sisi lain, saya bisa menerapkan semacam daftar tag, dan untuk setiap tag akan ada daftar file. Saat ini saya agak sibuk, jadi saya butuh selamanya untuk merespons, tetapi saya akan mencoba untuk mengeluarkan jawaban ASAP. Mungkinkah untuk menempatkan hadiah lagi sekali ini keluar?
Sergiy Kolodyazhnyy
@Serg aku tidak cukup kaya untuk menawarkan hadiah lain :) Tapi jika yang ini berjalan tanpa ada yang memenangkannya (apakah itu mungkin?) Dan jika jawaban Anda (ketika itu datang) adalah yang terbaik, tentu, saya akan menawarkan hadiah itu untuk you :) :)
deshmukh

Jawaban:

9

Isi:

  1. pengantar
  2. Instalasi
  3. Pemakaian
  4. Kode sumber

1. Perkenalan

Solusi ini terdiri dari dua skrip - satu untuk penandaan, satu untuk membaca daftar file di bawah tag tertentu. Keduanya harus hidup ~/.local/share/nautilus/scriptsdan diaktifkan melalui klik kanan di Nautilus file manager pada file apa pun, dan menavigasi ke submenu Script. Kode sumber untuk setiap skrip disediakan di sini juga di GitHub

2. Instalasi

Kedua skrip harus disimpan ke ~/.local/share/nautilus/scripts, di mana ~direktori home user, dan dapat dieksekusi chmod +x filename. Untuk pemasangan yang mudah, gunakan skrip bash berikut:

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

Memberi tag pada file :

Pilih file dalam pengelola file Nautilus, klik kanan padanya, dan navigasikan ke submenu Script. Pilih tag_file.py. Hit Enter masukkan deskripsi gambar di sini Pertama kali Anda menjalankan skrip ini, tidak akan ada file konfigurasi, jadi Anda akan melihat ini:

masukkan deskripsi gambar di sini

Lain kali, ketika Anda sudah memiliki beberapa tag file, Anda akan melihat popup yang memungkinkan Anda untuk memilih tag dan / atau menambahkan yang baru (dengan cara ini Anda dapat merekam file di bawah beberapa tag). Tekan OKuntuk menambahkan file ke tag ini. Catatan : Hindari memiliki "|" simbol dalam nama tag.

masukkan deskripsi gambar di sini

Script mencatat semua yang ada di ~/.tagged_files. File itu pada dasarnya adalah jsonkamus (yang bukan sesuatu yang harus dipedulikan oleh pengguna biasa, tetapi lebih nyaman bagi programmer :)). Format file itu adalah seperti ini:

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

Jika Anda ingin "membatalkan" beberapa file, hapus saja entri dari daftar itu. Pikirkan format dan koma.

Pencarian dengan tag :

Sekarang Anda memiliki ~/.tagged_filesbasis data file yang bagus, Anda dapat membaca file itu, atau menggunakan read_tags.pyskrip.

Klik kanan pada file apa pun di Nautilus (benar-benar tidak masalah yang mana) read_tags.py. Pilih . MemukulEnter masukkan deskripsi gambar di sini

Anda akan melihat popup yang menanyakan tag apa yang ingin Anda cari:

masukkan deskripsi gambar di sini

Pilih satu, klik OK. Anda akan melihat dialog daftar yang menunjukkan file yang Anda inginkan ada untuk tag yang Anda pilih. Anda dapat memilih file tunggal dan akan terbuka dengan program default yang ditetapkan untuk jenis file itu.

masukkan deskripsi gambar di sini

4. Kode sumber:

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
sumber
ini keren. Anda selalu memiliki solusi paling menarik.
@Serg, ini luar biasa. Akankah tag menempel ketika saya memindahkan file? Atau ketika saya menghapus file, apakah masih akan ditampilkan di hasil pencarian?
deshmukh
@deshmukh Tidak, tag tidak menempel jika Anda memindahkan file, dan file yang dihapus muncul. Saya bisa menerapkan memeriksa file yang dihapus (sebenarnya cukup mudah, itu hanya beberapa baris). Pada dasarnya Anda memiliki basis data tag dan file-file mereka, dan database ini harus dipelihara
Sergiy Kolodyazhnyy
@Serg, kita sudah sangat dekat namun sejauh ini. Karena kecuali jika jenis tag 'menempel' pada file (sehingga mereka tetap ada bahkan setelah memindahkan file), itu sama bagus atau buruknya dengan struktur direktori hierarkis kecuali satu file dapat memiliki banyak tag. Saya tidak, bahkan untuk sesaat, meremehkan pekerjaan luar biasa Anda. Saya hanya mengatakan bahwa itu masih belum memenuhi kebutuhan saya (mungkin, gila). Juga, seperti kata jargonjunkie dalam komentar terpisah, mungkin menandai file secara langsung bisa menjadi solusinya (seperti kita memberi tag foto atau bookmark). Tapi ini adalah kata-kata seorang pemula.
deshmukh
@deshmukh Saya setuju, menandai file secara langsung akan ideal. Saya belum menemukan cara untuk melakukannya, setidaknya belum. Saya sudah mencoba beberapa pendekatan, tetapi tidak membuahkan hasil. Saya berpotensi membuat skrip yang secara berkala memeriksa apakah semua file ada, tapi itu yang terbaik yang bisa saya lakukan, qnd itu akan sangat tidak efisien jika jumlah file bertambah besar dalam file konfigurasi. Saya harap ini dapat bermanfaat bagi sebagian orang, tetapi saya setuju - ini bukan solusi yang Anda cari
Sergiy Kolodyazhnyy
1

Saya telah menemukan cara untuk melakukan ini.

Buka terminal ( CTRL+ ALT+ T) dan kemudian jalankan perintah ini:

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

Masukkan kata sandi Anda, dan ketika diminta, tekan enter, lalu jalankan

sudo apt-get update

kemudian

sudo apt-get install tracker tracker-gui

Jangan khawatir jika dikatakan sudah versi terbaru.

Sekarang buka Nautilus / Files dan klik kanan dokumen yang ingin Anda tambahkan tag. Pilih properti, lalu pilih tab yang bertuliskan "Tag". Masukkan tag ke kotak teks dan tekan enter atau klik tombol Add untuk menambahkannya. Anda juga dapat mengklik tag yang sudah Anda tambahkan dan pilih tombol Hapus untuk menghapus tag. Harap perhatikan bahwa tag peka terhadap huruf besar-kecil. Tag yang Anda buat akan tetap ada di seluruh sistem, sehingga Anda dapat dengan mudah memberi tanda centang di sebelah tag yang sudah Anda buat untuk menandai file alih-alih mengetiknya secara manual lagi.

Setelah menandai item yang diinginkan, sekarang Anda dapat mencarinya, tetapi tidak di File. Buka aktivitas, dan cari aplikasi Desktop Search. Luncurkan, dan lihat opsi di atas. Di sisi kiri atas Window, klik ikon folder dengan ujung alat "Tampilkan hasil dengan file dalam daftar". Sekarang Anda memiliki lebih banyak opsi. Pilih opsi di sebelah kiri kotak pencarian dengan ujung alat "Temukan kriteria pencarian hanya dalam tag file". Sekarang Anda dapat mencari tag!

Untuk menggunakan ini, masukkan tag yang ingin Anda cari, dipisahkan dengan koma dan tekan enter. Sebagai contoh:

Penting, September, Presentasi

Ini hanya akan menampilkan file yang memiliki ketiga tag: "Penting", "September", dan "Presentasi".

Dengan mengklik ganda satu, itu akan membuka file dalam program default, dan dengan mengklik kanan dan memilih "Show Parent Directory", itu akan membuka lokasi itu di Nautilus.

Di Pencarian Desktop, Anda juga dapat mengklik tombol kedua dari kanan di bagian atas jendela (biasanya bintang atau hati) untuk mengedit tag di aplikasi itu sendiri!

Itu dia! Semoga ini membantu. Jika Anda memiliki pertanyaan lagi, beri tahu saya.

ComputerGuy
sumber
0

Jawaban singkat: Ini tidak mungkin secara asli di Ubuntu. Anda memerlukan beberapa ekstensi atau database dokumen, seperti yang disarankan oleh jawaban lain.

Opsi lain yang bisa saya rekomendasikan adalah menggunakan aplikasi TagSpaces . Aplikasi ini dapat menyimpan tag dalam nama file , yang membuat penandaan tahan lama dan portabel. Anda dapat mengedit nama file di Nautilus atau di dalam Cloud-Storage Anda dan tag akan muncul di TagSpaces dan sebaliknya.

tangkapan layar

kurung piksel
sumber