As informações de cor estão disponíveis no atributo com.apple.FinderInfo
extended.
$ 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
Primeira linha, décimo byte, bits 3-1 (isto é, aqueles com valores binários 2, 4 e 8). O exemplo de saída é para um arquivo vermelho sem nenhum outro conjunto de valores.
Se o atributo não estiver disponível ou o nibble for 0
, ele será incolor.
Valores possíveis na ordem do menu de contexto da esquerda para a direita:
0
(incolor), C
(vermelho), E
, A
, 4
, 8
, 6
, 2
(cinza).
Lembre-se de verificar possíveis valores de 1
para o último bit, ou seja, 3
também seria cinza + algum outro atributo.
Uma solução possível seria a seguinte:
Defina uma função ls
in ~/.bash_profile
que faz algo ligeiramente diferente se nenhum parâmetro for fornecido:
function ls {
if [ "$#" = "0" ] ; then
find . -maxdepth 1 -exec ~/Library/Scripts/colorize.sh '{}' \;
else
$( which ls ) $@
fi
}
colorize.sh
poderia ser semelhante ao seguinte, chamando um script Python e imprimindo o nome do arquivo, dependendo da saída:
#!/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 )"
E attrs.py
, que extrai atributos de arquivo relevantes, no mesmo diretório:
#!/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]
Eu não tenho uma seleção de cores grande o suficiente aqui, então vermelho e laranja são ambos impressos em vermelho.
Adicionei o atributo hidden
aqui, pois sou interessado nessa parte da modificação de ls
output. Apenas remova a instrução if
se você não quiser.