web-dev-qa-db-ja.com

タグでファイルを検索する方法は?

Nautilusでファイルにタグを付けることはできますが、これまでにタグでファイルを見つけるための解決策が見つかりませんでした。 Tracker-search-toolは、タグの検索を提供しません。Nautilusも、私が知っている他のアプリケーションも検索しません。 11.04にアップグレードしました。

13
user16676

トラッカータグと呼ばれます。

http://manpages.ubuntu.com/manpages/natty/man1/tracker-tag.1.html

これは、トラッカー機能のコマンドラインバージョンであるtracker-utilsパッケージによって提供されます。

-s -- lists all files associated with a tag
-a -- Add a tag to a file

タグを追加するには:

tracker-tag -a TAG file

タグで検索するには:

tracker-tag -s TAG
Result: 1
  /home/sean/file

私のシステムからの実世界の例

<sean@mymachine:~> tracker-tag -a TAG exten
<sean@mymachine:~> tracker-tag -a testing atreides master.ldif php_error.log TrainingUpdates.otl

<sean@mymachine:~> tracker-tag -s testing
Results: 5
  /home/sean/TrainingUpdates.otl
  /home/sean/atreides
  /home/sean/exten
  /home/sean/master.ldif
  /home/sean/php_error.log

<sean@mymachine:~> tracker-tag -a myTagExample TrainingUpdates.otl atreides exten master.ldif php_error.log 
<sean@mymachine:~> tracker-tag -s myTagExample
Results: 5
  /home/sean/TrainingUpdates.otl
  /home/sean/atreides
  /home/sean/exten
  /home/sean/master.ldif
  /home/sean/php_error.log

<sean@mymachine:~> tracker-tag -s TAG
Result: 1
  /home/sean/exten
6
Sean Lewis

Tracker-tagを使用して、コマンドラインからタグを検索します。上記の検索構文は、私のシステム(12.04)では機能しません。 「-s」オプションは、「-list」でのみ使用可能です。

tracker-tag --list -s [tag]

これは最初の回答に対するコメントですが、コメントできる担当者がまだいません:-(

2
Mrmfldmn

Gnome-team ppaのNautilusには、add-removeタグ用のプラグイン、検索用のbun nofがあります。 nautilusチームに新しいパネルビューを要求したとき( https://bugzilla.gnome.org/show_bug.cgi?id=67016 )この答えを得ました。

- the interface that allows to add tracker tags from Nautilus is not part of
Nautilus, but it's an extension
- we will not add any additional side pane, since we intentionally trimmed them
down to Places and Tree for Nautilus 3.0
- I think the best way to do what you want is from Tracker itself; if the UI
utilities shipped with Tracker don't allow you to do this, you should file a
bug against Tracker for it

そのため、私はこのためにnautilus-python拡張機能を作成しました。 python-nautilusをインストールしてトラッカーに送信 https://bugzilla.gnome.org/show_bug.cgi?id=67064

Sudo apt-get install python nautilus

次に、次のコードをコピーして、.local/share/nautilus-python/extensions/[filename] .pyに保存します

#[email protected]
#nautilus etiketa bilatzaile
#v 0.1

from gi.repository import Nautilus, GObject
from gi.repository import Gtk as gtk
from gi.repository.GdkPixbuf import Pixbuf
from subprocess import Popen, PIPE, STDOUT,call
from os import path,environ
from sys import platform
from urllib import unquote
from mimetypes import guess_type
import locale

class TagsManager:
    def __init__(self):
        self.d={}
        self.dtag={}
        cmd='tracker-tag -t'
        p=Popen(cmd,Shell=True,stdin=PIPE, stdout=PIPE, stderr=STDOUT,close_fds=True)
        output = p.stdout.read()
        l=output.split('\n')
        while('' in l): l.remove('')
        if len(l)>3:
            for i in range(2,len(l),3):
                if i+2<len(l):self.d[l[i].strip()]=int(l[i+2][:l[i+2].find('f')])
            original_list=[i for i in self.d.keys()]
        #lk.sort()
        decorated = [(s.lower(), s) for s in original_list]
        decorated.sort()
        lk = [s[1] for s in decorated]
        print lk
        for tag in lk:
            if self.d[tag]<>0:
                cmd='tracker-tag -t -s'
                p=Popen(cmd,Shell=True,stdin=PIPE, stdout=PIPE, stderr=STDOUT,close_fds=True)
                output = p.stdout.read()
                l=output.split('\n')
                ll= [unquote(i.strip()).decode('utf-8') for i in l]
                ini=ll.index(tag)
                lkini=lk.index(unicode(tag))
                if tag==lk[-1]:
                    resp=ll[ini+1:]
                    while('' in resp): resp.remove('')
                else:
                    fin=ll.index(lk[lkini+1])
                    resp=[ll[i] for i in range(ini+1,fin)]
                self.dtag[tag]=resp

class Ventana:
    def clic(self, widget, event, data=None):
        l=[]
        lista_nueva=[]
        for i in self.todas.get_selection().get_selected_rows()[1]:
            t= self.todas.get_model().get_value(self.todas.get_model().get_iter(i), 0)
            l.append(t)
        if len(l)==1:
            lista_nueva=[i for i in self.tm.dtag[l[0]]]
        Elif len(l)>1:
            lista_nueva=[i for i in self.tm.dtag[l[0]]]
            for i in l[1:]:
                ll=[]
                for f in self.tm.dtag[i]:
                    if f in lista_nueva: ll.append(f)
                lista_nueva=[f for f in ll]
        else:lista_nueva=[]
        self.files.get_model().clear()
        lista=[f.encode('utf-8')[7:] for f in lista_nueva]
        lf=[i for i in lista if path.isfile(i)]
        ld=[i for i in lista if not path.isfile(i)]
        lista_nueva=ld+lf
        for f in lista_nueva:
            mime_type= guess_type(path.basename(f))
            if mime_type[0]<>None:
                icon= 'gnome-mime-'+mime_type[0].replace('/','-')
            else:
                print f.encode('utf-8'),path.isfile(f)
                if path.isfile(f):icon='gtk-file'
                else:icon='folder'
            pixbuf = gtk.IconTheme.get_default().load_icon(icon, 48, 0)
            self.files.get_model().append([pixbuf,path.basename(f),f])
        return False

    def open_file(self, iconview, ipath):
        model = iconview.get_model()
        iter = model.get_iter(ipath)
        filename = model.get_value(iter, 2)
        if platform == 'linux2':
            call(["xdg-open", filename])
        return

    def __init__(self):
        self.tm=TagsManager()
        self.paned = gtk.HPaned()

        self.existentags = gtk.ListStore(str)
        tags=[i for i in self.tm.d.keys()]
        tags.sort()
        for t in tags:
            self.existentags.append([t])
        self.todas = gtk.TreeView(self.existentags)
        self.todas.get_selection().set_mode(gtk.SelectionMode.MULTIPLE)
        cell = gtk.CellRendererText()
        self.todas.connect("button_release_event", self.clic, None)
        column0=gtk.TreeViewColumn("Tags",cell, text=0)
        self.todas.append_column(column0) 
        scrolled_window = gtk.ScrolledWindow()
        scrolled_window.set_policy(gtk.PolicyType.AUTOMATIC, gtk.PolicyType.AUTOMATIC)
        scrolled_window.add_with_viewport (self.todas)
        self.paned.add1(scrolled_window)

        self.listfiles = gtk.ListStore(Pixbuf,str,str)
        self.files = gtk.IconView.new()
        self.files.set_model(self.listfiles)
        self.files.set_pixbuf_column(0)
        self.files.set_text_column(1)
        self.files.connect('item-activated', self.open_file)
        scrolled_window2 = gtk.ScrolledWindow()
        scrolled_window2.set_policy(gtk.PolicyType.AUTOMATIC, gtk.PolicyType.AUTOMATIC)
        scrolled_window2.add_with_viewport (self.files)
        self.paned.add2(scrolled_window2)
        self.paned.set_position(150)
        self.paned.show_all()

class PApplication(gtk.Application):
    def __init__(self,window):
        self.dialog = gtk.Dialog ("Etiketa iragazkia", window, gtk.DialogFlags.MODAL,
                                      (gtk.STOCK_CLOSE, gtk.ResponseType.CLOSE,))
        self.dialog.set_icon_name (gtk.STOCK_EDIT)
        self.dialog.set_size_request(600, 400)

        TS=Ventana()
        self.dialog.vbox.pack_start (TS.paned,expand=True, fill=True, padding=0)

class Pr(GObject.GObject, Nautilus.MenuProvider):
    def __init__(self):
        pass

    def ojo(self,menu,window):
        d=PApplication(window)
        r=d.dialog.run()
        d.dialog.destroy()
        return

    def get_background_items(self, window, files):
        return self.menuItem(window)

    def get_file_items(self, window, files):
        return self.menuItem(window)

    def menuItem(self, window):
        self.window=window
        P = Nautilus.MenuItem(
            name="Etiketa iragazkia::Etiketa iragazkia",
            label="Etiketa iragazkia",
            tip="Etiketa iragazkia"
        )
        P.connect('activate', self.ojo, window)
        return [P]

そして最後にnautilusを再起動します

nautilus -q

ファイルまたはバックグラウンドで新しいメニュー項目「Etiketa iragazkia」(バスク語のタグフィルター)を右クリックすると。

2
Natxo