태그를 기반으로 파일에 태그를 지정하고 나중에 검색하려면 어떻게해야합니까?


15

우분투 그놈을 실행합니다.

PDF 및 기타 문서가 많이 있으며 태그를 지정하고 싶습니다. 나중에이 태그를 기준으로 검색하십시오. 파일을 다른 폴더로 이동하더라도 태그가 파일에 고정됩니다.

검색했지만 파일 및 문서에서이 옵션을 제공하지 않습니다.

내가 뭔가 잘못하고 있습니까? 나중에 태그를 기준으로 검색 할 수 있도록 파일에 태그를 지정하려면 어떻게해야합니까?


PDF 문서에 태그를 추가하는 것만 해당 질문의 일부 (검색 태그가 아닌)는 이 답변을
karel

태그 지정 대신 파일을 "책갈피 표시"옵션으로 고려 하시겠습니까?
Sergiy Kolodyazhnyy

@ Serg 나는 확실하지 않다. 조금 설명해 주시겠습니까? 이 책갈피에 Firefox 책갈피와 같은 태그가있을 수 있습니까? 파일을 이동해도 계속 유지됩니까?
deshmukh

@deshmukh 다음은 이전에 수행 한 작업입니다. askubuntu.com/q/803644/295286 기본적으로 폴더 내부의 파일에 대한 심볼릭 링크를 만듭니다. 반면에, 일종의 태그 목록을 구현할 수 있었고 각 태그마다 파일 목록이 있습니다. 현재는 다소 바쁘기 때문에 응답하는 데 시간이 오래 걸리지 만 최대한 빨리 답변을 드리겠습니다. 이 시간이 초과되면 현상금을 다시 넣을 수 있습니까?
Sergiy Kolodyazhnyy

@ Serg 나는 다른 현상금을 제공 할만 큼 부자가 아닙니다 :) 그러나이 사람이 아무도 이기지 않고 가면 (그것도 가능합니까?) 그리고 당신의 대답 (그렇다면)이 최고라면, 나는 현상금을 제공 할 것입니다. you :) :)
deshmukh

답변:


9

내용:

  1. 소개
  2. 설치
  3. 용법
  4. 소스 코드

1. 소개

이 솔루션은 태그 지정 용 스크립트와 특정 태그 아래의 파일 목록을 읽는 스크립트로 구성됩니다. 두 ~/.local/share/nautilus/scripts파일 모두 파일의 노틸러스 파일 관리자를 마우스 오른쪽 버튼으로 클릭하고 스크립트 하위 메뉴로 이동하여 활성화하고 활성화해야합니다. 각 스크립트의 소스 코드는 다음과 같이 여기에 제공됩니다. 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. 사용법 :

파일 태깅 :

노틸러스 파일 관리자에서 파일을 선택하고 마우스 오른쪽 버튼으로 클릭 한 다음 스크립트 하위 메뉴로 이동하십시오. 를 선택하십시오 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 스크립트를 있습니다.

노틸러스의 파일을 마우스 오른쪽 버튼으로 클릭하십시오 (실제로 중요하지 않습니다) read_tags.py. 히트Enter 여기에 이미지 설명을 입력하십시오

검색하려는 태그를 묻는 팝업이 표시됩니다.

여기에 이미지 설명을 입력하십시오

하나를 선택하고을 클릭하십시오 OK. 선택한 태그에 대한 파일을 원한다는 목록 대화 상자가 표시됩니다. 단일 파일을 선택할 수 있으며 해당 파일 형식에 지정된 기본 프로그램으로 열립니다.

여기에 이미지 설명을 입력하십시오

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 우리는 지금까지 너무 가까이 있습니다. 태그가 파일에 '고착'하는 것이 아니라면 (파일을 이동 한 후에도 그대로 유지됨), 파일 하나에 여러 개의 태그가있을 수 있다는 점을 제외하고는 계층 적 디렉토리 구조만큼이나 나쁩니다. 나는 심지어 당신의 훌륭한 일을 놀라게하지 않습니다. 나는 그것이 여전히 내 (필요하거나 미친) 요구를 해결하지 못한다고 말하고 있습니다. 또한 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

그것이 이미 최신 버전이라고해도 걱정하지 마십시오.

이제 노틸러스 / 파일을 열고 태그를 추가하려는 문서를 마우스 오른쪽 버튼으로 클릭하십시오. 속성을 선택한 다음 "태그"라고 표시된 탭을 선택하십시오. 텍스트 상자에 태그를 입력하고 Enter를 누르거나 추가 단추를 클릭하여 추가하십시오. 이미 추가 한 태그를 클릭하고 제거 버튼을 선택하여 태그를 제거 할 수도 있습니다. 태그는 대소 문자를 구분합니다. 생성 한 태그는 시스템 전체에서 영구적이므로 수동으로 다시 입력하지 않고 이미 생성 한 태그 옆에 파일을 표시하도록 쉽게 확인할 수 있습니다.

원하는 항목에 태그를 지정한 후에는 파일에서 검색 할 수 없지만 검색 할 수 있습니다. 활동으로 이동하여 앱을 검색하십시오.Desktop Search . 그것을 시작하고 상단의 옵션을보십시오. 창의 왼쪽 상단에서 "팁을 파일로 결과 표시"도구 설명이있는 폴더 아이콘을 클릭하십시오. 이제 더 많은 옵션이 있습니다. "파일 태그에서만 검색 기준 찾기"도구 설명이있는 검색 상자 왼쪽의 옵션을 선택하십시오. 이제 태그를 검색 할 수 있습니다!

이를 사용하려면 검색하려는 태그를 쉼표로 구분하여 입력하고 Enter를 누르십시오. 예를 들면 다음과 같습니다.

중요한 9 월 발표

"중요", "9 월"및 "프레젠테이션"이라는 세 가지 태그가 모두있는 파일 만 표시됩니다.

하나를 두 번 클릭하면 기본 프로그램에서 파일이 열리고 마우스 오른쪽 단추를 클릭하고 "부모 디렉토리 표시"를 선택하면 노틸러스의 위치가 열립니다.

데스크톱 검색에서 창 상단 오른쪽 (보통 별 또는 하트)의 두 번째 버튼을 클릭하여 앱 자체에서 태그를 편집 할 수도 있습니다!

거기 있어요! 도움이 되었기를 바랍니다. 더 궁금한 점이 있으면 알려주세요.


0

짧은 답변 : 우분투에서는 기본적으로 불가능합니다. 다른 답변에서 제안한대로 확장명 또는 문서 데이터베이스가 필요합니다.

내가 추천 할 수있는 또 다른 옵션은 앱 TagSpaces 를 사용하는 입니다. 이 앱은 파일 이름에 태그를 저장 하여 태그를 내구성 있고 휴대 할 수 있습니다. 노틸러스 또는 클라우드 스토리지 내에서 파일 이름을 편집 할 수 있으며 태그는 TagSpaces에 나타나고 그 반대도 마찬가지입니다.

스크린 샷

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.