Nội dung:
- Giới thiệu
- Cài đặt
- Sử dụng
- Mã nguồn
1. Giới thiệu
Giải pháp này bao gồm hai tập lệnh - một để gắn thẻ, một để đọc danh sách các tệp theo thẻ cụ thể. Cả hai phải sống ở~/.local/share/nautilus/scripts
và kích hoạt thông qua nhấp chuột phải vào trình quản lý tệp Nautilus trên bất kỳ tệp nào và điều hướng đến menu con ScScript. Mã nguồn cho mỗi tập lệnh được cung cấp tại đây cũng như trên GitHub
2. Cài đặt
Cả hai tập lệnh phải được lưu vào ~/.local/share/nautilus/scripts
, ~
thư mục chính của người dùng và được thực thi với chmod +x filename
. Để cài đặt dễ dàng, hãy sử dụng tập lệnh bash sau:
#!/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. Cách sử dụng:
Gắn thẻ tập tin :
Chọn các tệp trong trình quản lý tệp Nautilus, nhấp chuột phải vào chúng và điều hướng đến menu con ScScript. Chọn tag_file.py
. Hit Enter
Lần đầu tiên bạn chạy kịch bản này, sẽ không có tập tin cấu hình, do đó bạn sẽ thấy điều này:
Lần tới, khi bạn đã có một số tệp được gắn thẻ, bạn sẽ thấy một cửa sổ bật lên cho phép bạn chọn một thẻ và / hoặc thêm một tệp mới (theo cách này bạn có thể ghi tệp dưới nhiều thẻ). Nhấn OKđể thêm tập tin vào thẻ này. Lưu ý : Tránh có "|" biểu tượng trong tên thẻ.
Kịch bản ghi lại mọi thứ trong ~/.tagged_files
. Tập tin đó thực chất là một json
cuốn từ điển (không phải là thứ mà người dùng thông thường nên quan tâm, nhưng nó thuận tiện cho các lập trình viên :)). Định dạng của tập tin đó là như vậy:
{
"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"
]
}
Nếu bạn muốn "bỏ chặn" một số tệp, chỉ cần xóa một mục khỏi danh sách đó. Nhớ định dạng và dấu phẩy.
Tìm kiếm theo thẻ :
Bây giờ bạn có một ~/.tagged_files
cơ sở dữ liệu tốt về các tệp, bạn có thể đọc tệp đó hoặc sử dụng read_tags.py
tập lệnh.
Nhấp chuột phải vào bất kỳ tệp nào trong Nautilus (thực sự không quan trọng) read_tags.py
. Chọn . ĐánhEnter
Bạn sẽ thấy một cửa sổ bật lên hỏi bạn muốn tìm kiếm thẻ nào:
Chọn một, nhấp vào OK. Bạn sẽ thấy một hộp thoại danh sách hiển thị bạn muốn có tệp cho thẻ bạn đã chọn. Bạn có thể chọn bất kỳ tệp nào và nó sẽ mở với một chương trình mặc định được gán cho loại tệp đó.
4. Mã nguồn:
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))