Dosyaları etikete göre nasıl etiketleyebilir ve daha sonra arayabilirim?


15

Ubuntu Gnome çalıştırıyor.

Çok sayıda PDF ve diğer belgelerim var ve bunları etiketlemek istiyorum. Ve daha sonra bu etiketlere göre arama yapın. Dosyaları farklı klasörlere taşımasam bile (yani etiketler dosyalara yapışır).

Arama yaptım ancak Dosyalar ve Belgeler bu seçenekleri sunmuyor.

Yanlış bir şey mi yapıyorum? Dosyaları daha sonra etiketlere göre arayabilmem için nasıl etiketleyebilirim?


Sorunun bir kısmı (ancak sorunun arama etiketleri kısmı değil) PDF belgelerine etiket eklemek için bu cevaba
karel

Bir dosyayı etiketlemek yerine "yer işareti" olarak seçenek olarak düşünür müsünüz?
Sergiy Kolodyazhnyy

@ Net değilim. Biraz açıklayabilir misin? Bu yer işaretlerinin Firefox yer işaretleri gibi etiketleri olabilir mi? Dosyayı taşımasam bile kalacaklar mı?
deshmukh

@deshmukh Daha önce yaptığım şey: askubuntu.com/q/803644/295286 Temelde bir klasörün içinde dosyalamak için bir sembolik bağlantı oluşturur. Öte yandan, bir tür etiket listesi uygulayabilirim ve her bir etiket için dosya listesi olurdu. Şu anda biraz meşgulüm, bu yüzden cevap vermem sonsuza kadar sürüyor, ancak ASAP cevabını vermeye çalışacağım. Bu kez bir kez daha ödül vermek mümkün mü?
Sergiy Kolodyazhnyy

@Serg Ben başka bir ödül sunacak kadar zengin değilim :) Ama eğer bunu kazanan kimse olmadan giderse (hatta mümkün mü?) you :) :)
deshmukh

Yanıtlar:


9

İçindekiler:

  1. Giriş
  2. Kurulum
  3. kullanım
  4. Kaynak kodu

1. Giriş

Bu çözüm, bir tanesi etiketleme, diğeri belirli bir etiket altındaki dosyaların listesini okumak için olmak üzere iki komut dosyasından oluşur. Her ikisinin de yaşaması ~/.local/share/nautilus/scriptsve herhangi bir dosyadaki Nautilus dosya yöneticisinde sağ tıklama ve Komut Dosyaları alt menüsüne gitme yoluyla etkinleştirilmesi gerekir . Her komut dosyasının kaynak kodu burada ve GitHub'da sağlanır

2. Kurulum

Her iki komut dosyaları kaydedilmesi gerekir ~/.local/share/nautilus/scriptsnerede, ~kullanıcının ev dizini ve birlikte çalıştırılabilir yapılır chmod +x filename. Kolay kurulum için aşağıdaki bash betiğini kullanın:

#!/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. Kullanımı:

Dosyaları etiketleme :

Nautilus dosya yöneticisinde dosyaları seçin, sağ tıklayın ve Komut Dosyaları alt menüsüne gidin. Seçin tag_file.py. Hit Enter resim açıklamasını buraya girin Bu komut dosyasını ilk kez çalıştırdığınızda, yapılandırma dosyası olmayacaktır, bu yüzden şunu göreceksiniz:

resim açıklamasını buraya girin

Bir dahaki sefere zaten etiketlenmiş bazı dosyalarınız olduğunda, bir etiket seçmenize ve / veya yeni bir etiket eklemenize izin veren bir açılır pencere göreceksiniz (bu şekilde birden fazla etiket altında dosya kaydedebilirsiniz). Hit OKBu etikete dosyaları eklemek. Not : "|" kullanmaktan kaçının etiket adındaki sembol.

resim açıklamasını buraya girin

Komut dosyası içindeki her şeyi kaydeder ~/.tagged_files. Bu dosya aslında bir jsonsözlüktür (bu, düzenli kullanıcıların önemsemesi gereken bir şey değildir, ancak programcılar için uygundur :)). Bu dosyanın biçimi şu şekildedir:

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

Herhangi bir dosyanın etiketini kaldırmak istediğinizde, o listeden bir girişi silmeniz yeterlidir. Biçime ve virgüllere dikkat edin.

Etikete göre arama :

Artık güzel bir ~/.tagged_filesdosya veritabanına sahip olduğunuza göre, bu dosyayı okuyabilir veya read_tags.pykomut dosyası kullanabilirsiniz .

Nautilus'ta herhangi bir dosyaya sağ tıklayın (hangisinin önemli olduğu) read_tags.py. hitEnter resim açıklamasını buraya girin

Hangi etiketi aramak istediğinizi soran bir açılır pencere göreceksiniz:

resim açıklamasını buraya girin

Birini seçin, tıklayın OK. Seçtiğiniz etiket için dosyaların orada olmasını istediğinizi gösteren bir liste iletişim kutusu göreceksiniz. Herhangi bir dosyayı seçebilirsiniz, bu dosya o dosya türüne atanmış varsayılan bir programla açılır.

resim açıklamasını buraya girin

4. Kaynak kodu:

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


bu havalı. her zaman en ilginç çözümlere sahip olursunuz.

@Bu harika. Dosyaları taşıdığımda etiketler yapışacak mı? Yoksa dosyaları sildiğimde hala arama sonuçlarında görünecek mi?
deshmukh

@deshmukh Hayır, dosyaları taşırsanız etiketler yapışmaz ve silinen dosyalar görünür. Silinen dosyaları kontrol edebilirim (aslında, sadece birkaç satır). Aslında bir veritabanı ve dosyaları bir veritabanı var, ve bu veritabanının korunması gerekir
Sergiy Kolodyazhnyy

@ Şu ana kadar henüz yakınız. Çünkü etiketler dosyalara 'yapışmazsa' (dosyayı hareket ettirdikten sonra bile kalırlar), bir dosyanın birden fazla etiketi olabilmesi dışında hiyerarşik bir dizin yapısı kadar iyi veya kötüdür. Bir an bile mükemmel işinizi küçümsemiyorum. Sadece diyorum ki hala benim (deli olabilir) ihtiyaçlarımı karşılamıyor. Ayrıca, jargonjunkie'nin ayrı bir yorumda söylediği gibi, dosyaları doğrudan etiketlemek çözüm olabilir (fotoğraf veya yer işaretlerini etiketlediğimiz gibi). Ama bunlar acemi sözleridir.
deshmukh

@deshmukh Kabul ediyorum, dosyaları doğrudan etiketlemek ideal olurdu. En azından henüz bunu yapmanın bir yolunu bulamadım. Birkaç yaklaşım denedim ama sonuç vermediler. Potansiyel olarak tüm dosyaların yerinde olup olmadığını periyodik olarak kontrol eden bir komut dosyası yapabilirim, ancak yapabileceğim en iyisi budur, qnd yapılandırma dosyasında dosya sayısı arttıkça son derece verimsiz olur. Umarım bu bazıları için yararlı olabilir, ama katılıyorum - bu tam olarak aradığınız bir çözüm değil
Sergiy Kolodyazhnyy

1

Bunu yapmanın bir yolunu buldum.

Bir terminal ( CTRL+ ALT+ T) açın ve şu komutu çalıştırın:

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

Şifrenizi girin ve Sorulduğunda enter tuşuna basın, ardından çalıştırın

sudo apt-get update

sonra

sudo apt-get install tracker tracker-gui

Zaten son sürüm olduğunu söylüyorsa endişelenmeyin.

Şimdi Nautilus / Files'ı açın ve etiket eklemek istediğiniz belgeye sağ tıklayın. Özellikleri seçin, ardından "Etiketler" yazan sekmeyi seçin. Metin kutusuna bir etiket girin ve enter tuşuna basın veya eklemek için Ekle düğmesini tıklayın. Ayrıca daha önce eklediğiniz bir etiketi tıklayabilir ve bir etiketi kaldırmak için Kaldır düğmesini seçebilirsiniz. Etiketlerin büyük / küçük harfe duyarlı olduğunu lütfen unutmayın. Oluşturduğunuz etiketler sistem genelinde kalıcı olacaktır, böylece dosyayı tekrar manuel olarak yazmak yerine, önceden işaretlediğiniz bir etiketin yanına kolayca bir onay işareti koyabilirsiniz.

İstenen öğeleri etiketledikten sonra, artık bunları arayabilir, ancak Dosyalar'da bulamazsınız. Etkinliklere gidin ve uygulamayı arayın Desktop Search. Başlatın ve üstteki seçeneklere bakın. Pencerenin sol üst tarafında, "Sonuçları bir listedeki dosyalara göre görüntüle" araç ipucu ile klasör simgesini tıklayın. Artık daha fazla seçeneğiniz var. "Yalnızca dosya etiketlerinde arama ölçütlerini bul" araç ipucuyla arama kutusunun hemen solundaki seçeneği belirleyin. Şimdi etiketleri arayabilirsiniz!

Bunu kullanmak için, virgülle ayırarak aramak istediğiniz etiketleri girin ve enter tuşuna basın. Örneğin:

Önemli, Eylül, Sunum

Bu yalnızca üç etiketi olan dosyaları gösterir: "Önemli", "Eylül" ve "Sunum".

Birini çift tıklatarak, dosyayı varsayılan programda açar ve sağ tıklayıp "Üst Dizini Göster" i seçerek Nautilus'taki konumunu açar.

Masaüstü Arama'da, uygulamanın kendisinde etiketleri düzenlemek için pencerenin sağındaki ikinci düğmeyi (genellikle bir yıldız veya kalp) da tıklayabilirsiniz!

İşte aldın! Bu yardımcı olur umarım. Daha fazla sorunuz varsa bana söyleyin.


0

Kısa cevap: Bu Ubuntu'da doğal olarak mümkün değildir. Diğer cevapların önerdiği gibi bir uzantıya veya belge veritabanına ihtiyacınız var.

Tavsiye edebileceğim başka bir seçenek, uygulamayı TagSpaces kullanmaktır . Bu uygulama, etiketleri dosya adında kaydedebilir , bu da etiketlemeyi dayanıklı ve taşınabilir hale getirir. Dosya adını Nautilus'ta veya Cloud-Storage'ınızda düzenleyebilirsiniz; etiket TagSpaces'de görünür veya bunun tersi de geçerlidir.

ekran görüntüsü

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.