Contenu:
- introduction
- Installation
- Usage
- Code source
1. Introduction
Cette solution se compose de deux scripts - un pour le balisage, un pour la lecture de la liste des fichiers sous une balise spécifique. Les deux doivent vivre ~/.local/share/nautilus/scripts
et être activés via un clic droit dans le gestionnaire de fichiers Nautilus sur n'importe quel fichier et en naviguant vers le sous-menu Scripts. Le code source de chaque script est fourni ici ainsi que sur GitHub
2. Installation
Les deux scripts doivent être enregistrés dans ~/.local/share/nautilus/scripts
, où se ~
trouve le répertoire personnel de l'utilisateur, et rendus exécutables avec chmod +x filename
. Pour une installation facile, utilisez le script bash suivant:
#!/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. Utilisation:
Balisage des fichiers :
Sélectionnez les fichiers dans le gestionnaire de fichiers Nautilus, faites un clic droit dessus et accédez au sous-menu Scripts. Sélectionnez tag_file.py
. Hit La Enter
première fois que vous exécutez ce script, il n'y aura pas de fichier de configuration, vous verrez donc ceci:
La prochaine fois, lorsque vous avez déjà des fichiers balisés, vous verrez une fenêtre contextuelle qui vous permet de sélectionner une balise et / ou d'en ajouter une nouvelle (de cette façon, vous pouvez enregistrer des fichiers sous plusieurs balises). Appuyez sur OKpour ajouter des fichiers à cette balise. Remarque : évitez d'avoir "|" symbole dans le nom de la balise.
Le script enregistre tout ~/.tagged_files
. Ce fichier est essentiellement un json
dictionnaire (ce qui n'est pas quelque chose qui devrait intéresser les utilisateurs réguliers, mais il est pratique pour les programmeurs :)). Le format de ce fichier est le suivant:
{
"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"
]
}
Si jamais vous voulez "décocher" un fichier, supprimez simplement une entrée de cette liste. Attention au format et aux virgules.
Recherche par tag :
Maintenant que vous avez une belle ~/.tagged_files
base de données de fichiers, vous pouvez soit lire ce fichier, soit utiliser un read_tags.py
script.
Faites un clic droit sur n'importe quel fichier dans Nautilus (peu importe lequel) read_tags.py
. Sélectionnez . FrappéEnter
Vous verrez une fenêtre contextuelle vous demandant quelle balise vous souhaitez rechercher:
Sélectionnez-en un, cliquez sur OK. Vous verrez une boîte de dialogue de liste indiquant que vous voulez que les fichiers soient là pour la balise que vous avez sélectionnée. Vous pouvez sélectionner n'importe quel fichier et il s'ouvrira avec un programme par défaut affecté à ce type de fichier.
4. Code source:
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))