有没有一种直接的方法可以根据 macOS 中的 Finder 标签颜色为 ls 输出着色?

Art*_*lor 7 finder terminal colors ls macos

我有一个带有目录树的客户端,其中包含许多我需要在本地开发机器上拥有的高级目录。除非出现问题,否则我很少看它们。

我在 Finder 中用灰色标签标记了“无趣”的标记,而我每天使用的标记标记为绿色标记。当我使用 Finder 时,这在极少数情况下工作正常。

相反,我使用 Terminal.app,尽管我并不反对其他终端模拟器,只要它们快速而强大。使用 时ls,即使使用@G标志,我也没有可以用来淡化无趣的目录条目的有用信息。(如果我可以ls通过一个简单的awk脚本来应用着色,我会很好。)

我知道我可以使用 osascript 来获取这个属性,然后装饰文件输出,但这可能会导致ls自 Unicos 以来最慢的实现。我也知道我可以使用 ls 更改默认颜色,但这并没有达到我需要的水平。

是否有一种简单、快速、已经存在的工具可以根据 Finder 标签颜色为 ls 输出着色,然后回退到$LSCOLORS? 或者那是我的下一个 GitHub 项目?

Dan*_*eck 17

颜色信息可从com.apple.FinderInfo扩展属性中获得。

$ xattr -p com.apple.FinderInfo filename
00 00 00 00 00 00 00 00 00 0C 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
Run Code Online (Sandbox Code Playgroud)

第一行,第十个字节,第 3-1 位(即具有二进制值 2、4 和 8 的那些)。示例输出适用于未设置其他值的红色文件。

如果属性不可用或半字节是0,则它是无色的。

上下文菜单顺序从左到右的可能值:( 0无色)、C(红色)EA4862(灰色)。

请记住检查1最后一位的可能值,即3也将是灰色 + 一些其他属性。


一种可能的解决方案如下:

定义一个函数ls~/.bash_profile如果没有给出参数,它会做一些稍微不同的事情:

function ls {
        if [ "$#" = "0" ] ; then
                find . -maxdepth 1 -exec ~/Library/Scripts/colorize.sh '{}' \;
        else
                $( which ls ) $@
        fi
}       
Run Code Online (Sandbox Code Playgroud)

colorize.sh 可能如下所示,调用 Python 脚本并根据其输出打印文件名:

#!/bin/bash

filename=$1

if [ ! -e "$filename" ] ; then
    exit
fi

filename="$( basename "$filename" )"

attrs=( $( $( dirname $0 )/attrs.py "$filename" | cut -f2 ) )

hidden=${attrs[0]}

if [ "$hidden" = "True" ] ; then
    exit
fi

color=${attrs[1]}

case "$color" in
    "none" )
        format="setab 8"
        ;;
    "red" )
        format="setab 1"
        ;;
    "orange" )
        format="setab 1"
        ;;
    "yellow" )
        format="setab 3"
        ;;
    "green" )
        format="setab 2"
        ;;
    "blue" )
        format="setab 4"
        ;;
    "purple" )
        format="setab 5"
        ;;
    "gray" )
        format="setab 7"
        ;;
esac

echo "$( tput $format )$filename$( tput sgr0 )"
Run Code Online (Sandbox Code Playgroud)

attrs.py,它提取相关文件属性,在同一目录中:

#!/usr/bin/env python

from sys import argv, exit
from xattr import xattr
from struct import unpack

if len(argv) < 2:
    print('Missing filename argument!')
    exit(1)

attrs = xattr(argv[1])

try:
    finder_attrs= attrs[u'com.apple.FinderInfo']

    flags = unpack(32*'B', finder_attrs)

    hidden = flags[8] & 64 == 64
    color = flags[9] >> 1 & 7
except:
    hidden = False
    color = 0

colornames = { 0: 'none', 1: 'gray', 2 : 'green', 3 : 'purple', 4 : 'blue', 5 : 'yellow', 6 : 'red', 7 : 'orange' }

print 'hidden:\t', hidden
print 'color:\t', colornames[color]
Run Code Online (Sandbox Code Playgroud)

我这里没有足够大的匹配颜色选择,所以红色和橙色都用红色打印。

在此处输入图片说明

在此处输入图片说明

我在hidden这里添加了属性,因为我对修改输出的那部分感兴趣lsif如果您不想要它,只需删除该语句。