如果徽标包含特定文件/子目录,请将徽标放在文件夹图标上

如何为所有目录创建脚本和系统规则,如果文件夹包含.git直接子文件夹,它将在每个目录的图标上应用标志? 我已经在这样的标志中加入了github标志图标

输出效果应如下:

在此处输入图像描述

Intorduction

注意:这是脚本的新版本和更新版本,对于旧版本,请参阅此答案的编辑历史记录

下面提供的脚本允许设置github存储库图标或标志(但不是两者),以及将元数据重置为默认值。 使用非常简单,如-h选项所述:

 $ ./set_folder_icon.py -h usage: set_folder_icon.py [-h] [-i ICON] [-e EMBLEM] [-r ROOT] [-u] Finds and sets github repository icons.Choose either --icon or --emblem. Without either the script exists with 0 exit status.For --icons, use absolute or relative path.For --emblem use single string of text.Emblem pathnames are in the format emblem-name.extension.The script then can becalled with -e .Use ~/.local/share/icons folder for custom emblems (if it does not exist - create it. Store filenames in specified format optional arguments: -h, --help show this help message and exit -i ICON, --icon ICON path to image to set -e EMBLEM, --emblem EMBLEM single-string emblem name -r ROOT, --root ROOT where search starts,default - current working directory -u, --unset unset both emblem and icon. Cannot be used with -e or -i options 

因此,如果我们想递归搜索所有github存储库的主文件夹并设置它们的标志,我们将执行set_folder_icon.py -e myemblemname -r $HOME或只是cd; set_folder_icon.py -e myemblemname cd; set_folder_icon.py -e myemblemname

为了获得最佳性能,请创建~/bin目录并将脚本存储为set_folder_icon.py 。 如果要立即使用它,请运行source ~/.bashrc 。 如果您使用的是其他shell,请确保将~/bin添加到$PATH变量中。

注意 :脚本可以使用--icon选项获取任意文件,但是--emblem要求您将特定文件存储在~/.local/share/icons ,文件名类似于emblem-github 。 有关示例,请参阅“操作中的脚本”部分

脚本在行动

我碰巧将所有github存储库保存在~/GIT文件夹下。 在下面的屏幕截图中,您可以看到所有github存储库如何将其徽标设置为自定义徽标。

之前:

在此处输入图像描述

后:

在此处输入图像描述

脚本

该脚本也可以在我的个人GitHub存储库中使用 ,它更有可能获得更新的更改和修复。

 #!/usr/bin/env python3 """ Author: Sergiy Kolodyazhnyy Date: 7/12/2017 Purpose: Script to find github repository folders and set their icons for Ubuntu. Written for: https://askubuntu.com/q/935003/295286 """ import argparse import os import sys import subprocess import urllib.parse def puke(message, status_code): """ Print to stderr and exit with given code """ sys.stderr.write('>>> OOOPS. Something is wrong:\n') sys.stderr.write(message + '\n') sys.exit(status_code) def run_cmd(cmdlist): """ Reusable function for running external commands """ try: stdout = subprocess.check_output(cmdlist) except subprocess.CalledProcessError as cpe: puke('Called command failed with ' + str(cpe.returncode) + ' exit status\n' + repr(cpe), 4) else: if stdout: return stdout def set_icon(directory, icon_type, image): """ Wrapper function that specifies command and calls run_cmd()""" key = 'metadata::' + icon_type meta = {'metadata::custom-icon': 'string', 'metadata::emblems': 'stringv'} # Because custom-icons and emblems type are mutually # exclusive, we need to unset custom-icon to enable emblems if icon_type == 'emblems': cmd = ['gvfs-set-attribute', '-t', 'unset', directory, 'metadata::custom-icon'] run_cmd(cmd) cmd = ['gvfs-set-attribute', '-t', meta[key], directory, key, image] return run_cmd(cmd) def unset_all(directory): for key in ['metadata::custom-icon', 'metadata::emblems']: run_cmd(['gvfs-set-attribute', '-t', 'unset', directory, key]) def find_directories(tree_root): """ Does the job of recursive traversal of given directory tree, starting at the specified tree root directory. If condition for given subdirectory is met, calls set_icon() function""" for current_dir, subdirs, files in os.walk(tree_root): # This check can be adapted to other cases if '.git' in subdirs: print('Found', current_dir) yield current_dir def parse_args(): """ Parses command-line arguments """ text = ['Finds and sets github repository icons.', 'Choose either --icon or --emblem. Without either' ' the script exists with 0 exit status.', 'For --icons, use absolute or relative path.', 'For --emblem use single string of text.', 'Emblem pathnames are in the format', ' emblem-name.extension.', 'The script then can be', 'called with -e .Use ~/.local/share/icons folder', ' for custom emblems (if it does not ', 'exist - create it. Store filenames in specified format'] arg_parser = argparse.ArgumentParser(description="".join(text)) arg_parser.add_argument('-i', '--icon', help='path to image to set', type=str, required=False) arg_parser.add_argument('-e', '--emblem', help='single-string emblem name', type=str, required=False) arg_parser.add_argument('-r', '--root', help='where search starts,' + 'default - current working directory', default='.', type=str, required=False) arg_parser.add_argument('-u', '--unset', help='unset both emblem ' + 'and icon. Cannot be used with -e or -i options', action='store_true', required=False) return arg_parser.parse_args() def main(): """ Script entry point """ # Parse command-line arguments and check their correctness args = parse_args() status_code = {'icon_missing': 1, 'root_missing': 2, 'root_isnt_dir': 3, 'exclusion': 4, 'not_string': 5, 'conflict': 6} if args.unset and (args.icon or args.emblem): puke('Conflicting options', status_code['conflict']) if not args.unset: # both or none are given if not args.icon and not args.emblem: sys.exit(0) if args.icon and args.emblem: puke('Can only use either --icon or --emblem', status_code['exclusion']) # Verify correctness of either one if args.icon and not os.path.exists(args.icon): puke('Icon pathname does not exist', status_code['icon_missing']) if args.emblem: if '/' in args.emblem: puke('Emblem must be a single string of text,no paths', status_code['not_string']) if not isinstance(args.emblem, str): puke('Given argument for emblem is not a string', stats_code['not_string']) # Verify correctness of the path if not os.path.exists(args.root): puke('Root pathname does not exist', status_code['root_missing']) if not os.path.isdir(args.root): puke('Root pathname is not a directory', status_code['root_isnt_dir']) if args.unset: for directory in find_directories(args.root): print('Unsetting', directory) unset_all(directory) sys.exit(0) # Everything should be OK past this point if args.icon: meta_type = 'custom-icon' icon = 'file://' + urllib.parse.quote(os.path.abspath(args.icon)) if args.emblem: meta_type = 'emblems' icon = args.emblem # Now do the actual traversal and icon-setting for directory in find_directories(args.root): set_icon(directory, meta_type, icon) if __name__ == '__main__': main() 

自动化脚本

当然,我们每次都可以手动运行脚本(实际上我可能会创建一个可以组合git clone并运行此脚本的函数),尽管我建议您每次登录GUI会话时都运行脚本。 为此,请打开“启动应用程序”菜单,然后添加脚本(建议使用完整路径和完整文件名)作为条目。

在此处输入图像描述

下次登录时,您的图标将被设置。

至于手动的想法,你可以用&&运算符一个接一个地运行git clone和脚本,或者更好的是在~/.bashrc为它做一个函数,如下所示:

 $ tree . 0 directories, 0 files $ typeset -f my_gitclone my_gitclone () { git clone "$1" && ~/GIT/sergrep/set_folder_icon.py -e github } $ my_gitclone https://github.com/SergKolo/sergrep Cloning into 'sergrep'... remote: Counting objects: 387, done. remote: Compressing objects: 100% (17/17), done. remote: Total 387 (delta 10), reused 17 (delta 5), pack-reused 365 Receiving objects: 100% (387/387), 115.65 KiB | 0 bytes/s, done. Resolving deltas: 100% (203/203), done. Checking connectivity... done. Found ./sergrep