ファイルにタグを付けて、タグに基づいて後で検索するにはどうすればよいですか?


15

Ubuntu Gnomeを実行します。

PDFやその他のドキュメントがたくさんあるので、タグを付けたいと思います。これらのタグに基づいて後で検索します。ファイルを別のフォルダーに移動しても(したがって、タグはファイルに固定されます)。

検索しましたが、ファイルとドキュメントにはこのオプションがありません。

私は何か間違っていますか?後でタグに基づいて検索できるようにファイルにタグを付けるにはどうすればよいですか?


質問(ただし、質問の検索タグ部分)の唯一のPDF文書にタグを追加する部分を参照してくださいこの回答
カレル

タグ付けではなくオプションとしてファイルを「ブックマーク」することを検討しますか?
セルギーKolodyazhnyy

@Sergはっきりしない。少し説明してもらえますか?これらのブックマークにFirefoxブックマークのようなタグを付けることはできますか?ファイルを移動しても残りますか?
デシュムク

@deshmukh以前にやった ことがあります:askubuntu.com/q/803644/295286基本的に、フォルダー内のファイルへのシンボリックリンクを作成します。一方、タグのリストのようなものを実装することができ、各タグにはファイルのリストがあります。現在、私は多少忙しいので、応答するには永遠に時間がかかりますが、できるだけ早く答えを出そうとします。これが一度タイムアウトしたら、再び賞金をかけることは可能でしょうか?
セルギーコロディアズニー16

@Serg私は別の報奨金を提供するのに十分な金持ちではありません:)しかし、もしこれが誰にも勝てない場合(それは可能ですか?)、そしてあなたの答え(それが来るとき)が最高である場合、確かに、私は報奨金を提供しますあなた:) :)
deshmukh

回答:


9

内容:

  1. 前書き
  2. 設置
  3. 使用法
  4. ソースコード

1.はじめに

このソリューションは、2つのスクリプトで構成されます。1つはタグ付け用、もう1つは特定のタグの下にあるファイルのリストの読み取り用です。どちらも~/.local/share/nautilus/scripts、任意のファイルでNautilusファイルマネージャーを右クリックし、[スクリプト]サブメニューに移動して、アクティブにしなければなりません。各スクリプトのソースコードは、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。選択したタグのファイルがあることを示すリストダイアログが表示されます。任意の1つのファイルを選択でき、そのファイルタイプに割り当てられたデフォルトのプログラムで開きます。

ここに画像の説明を入力してください

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


これはカッコいい。常に最も興味深いソリューションがあります。

@Sergこれは素晴らしい。ファイルを移動すると、タグは貼り付きますか?または、ファイルを削除しても、検索結果に表示されますか?
deshmukh

@deshmukhいいえ、ファイルを移動してもタグは固定されず、削除されたファイルは表示されます。削除されたファイルのチェックを実装することができました(実際には非常に簡単で、ほんの数行です)。基本的に、タグとそのファイルのデータベースがあり、このデータベースは保守する必要があります
Sergiy Kolodyazhnyy

@Sergこれまでのところまだ近いです。タグがファイルに「貼り付く」ような種類でない限り(ファイルを移動した後でも保持されるため)、1つのファイルに複数のタグを含めることができることを除いて、階層ディレクトリ構造と同じか悪いのです。一瞬であっても、あなたのすばらしい仕事を軽視しているわけではありません。私はそれが私の(おそらく、クレイジーな)ニーズにまだ対応していないと言っているだけです。また、jargonjunkieが別のコメントで述べたように、ファイルに直接タグ付けすることが解決策になる可能性があります(写真やブックマークにタグを付けるように)。しかし、これらは初心者の言葉です。
-deshmukh

@deshmukh同意しますが、ファイルに直接タグ付けするのが理想的です。少なくともまだ、そうする方法を見つけていないだけです。いくつかの方法を試しましたが、結果は得られませんでした。すべてのファイルが適切に配置されているかどうかを定期的にチェックするスクリプトを作成することもできますが、それが最善です。構成ファイルでファイルの数が大きくなると、非常に非効率になります。私は、これはいくつかに役立つことことを願って、私は同意する-これはあなたが探している正確なソリューションではありません
Sergiy Kolodyazhnyy

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を開き、タグを追加するドキュメントを右クリックします。プロパティを選択し、「タグ」というタブを選択します。テキストボックスにタグを入力してEnterキーを押すか、[追加]ボタンをクリックして追加します。追加済みのタグをクリックして、[削除]ボタンを選択してタグを削除することもできます。タグでは大文字と小文字が区別されることに注意してください。作成したタグはシステム全体で永続的であるため、ファイルを手動で再度入力する代わりに、作成済みのタグの横に簡単にチェックを入れてファイルをマークできます。

必要なアイテムにタグを付けたら、ファイルではなくアイテムを検索できます。アクティビティに移動して、アプリを検索しDesktop Searchます。それを起動し、上部のオプションを見てください。ウィンドウの左上で、ツールチップ「リスト内のファイルごとに結果を表示」でフォルダーアイコンをクリックします。さらに多くのオプションがあります。ツールチップ「ファイルタグの検索条件のみを検索」で検索ボックスのすぐ左側にあるオプションを選択します。タグを検索できるようになりました!

これを使用するには、検索するタグをコンマで区切って入力し、Enterキーを押します。例えば:

重要、9月、プレゼンテーション

これは、「重要」、「9月」、および「プレゼンテーション」の3つのタグすべてを持つファイルのみを表示します。

1つをダブルクリックすると、デフォルトのプログラムでファイルが開き、右クリックして[親ディレクトリを表示]を選択すると、Nautilusの場所が開きます。

デスクトップ検索では、ウィンドウ上部の右から2番目のボタン(通常は星またはハート)をクリックして、アプリ自体のタグを編集することもできます!

そこにある!お役に立てれば。他にご質問がある場合は、お知らせください。


0

簡単な答え:これはUbuntuではネイティブに実行できません。他の回答で示唆されているように、拡張機能またはドキュメントデータベースが必要です。

私が推奨できる別のオプションは、アプリのTagSpacesを使用することです。このアプリは、タグをfilenameに保存する場合があります。これにより、タグ付けの耐久性と移植性が向上します。NautilusまたはCloud-Storage内でファイル名を編集できます。タグはTagSpacesに表示され、その逆も同様です。

スクリーンショット

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.