Este script zsh analisa $LS_COLORS . Ele precisa apenas de uma chamada stat em todos os arquivos e, portanto, é muito mais rápido que a solução na parte inferior, que chama ls para cada arquivo. E lida com arquivos com espaços corretamente. ( \n ou \t ainda não são permitidos em nomes de arquivos)
No entanto, a implementação não está completa. Eu incluí apenas cores para diferentes tipos de arquivos que podem ser identificados pelo primeiro caractere da string do modo de arquivo (por exemplo, lrwxrwxrwx para um link simbólico) ou pela extensão do arquivo. Isso significa que as permissões graváveis do mundo, suid ou bits pegajosos não são coloridas especialmente. Para incluir esses também deve ser direto.
source do seguinte e use a nova função do shell duc para uma% coloridadu output:
zmodload -F zsh/stat b:zstat
function duc() {
emulate zsh
setopt no_nomatch interactivecomments # no_nomatch is necessary, to prevent error in "do .* *" if there are no dotfiles
typeset -a aline
typeset -A lscols
local dircols acolor
for i (${(s.:.)LS_COLORS}) { # split $LS_COLORS at ":"
aline=(${(s:=:)i}) # split every entry at "="
lscols+=(${${aline[1]}/*.} ${aline[2]}) # load every entry into the associative array $lscols
}
duout=$(du -sh .* * 2> /dev/null | grep -v '^0' | sort -hr)
for i (${(f)duout}) { # split output of "du" at newlines
aline=(${(ps:\t:)i}) # split every entry at \t
zstat -s +mode -A atype ${aline[2]} # determine mode (e.g. "drwx------") of file ${aline[2]}
case ${${atype[1]}[1]} in # ${${atype[1]}[1]} is the first character of the file mode
b) acolor=$lscols[bd] ;;
c|C) acolor=$lscols[cd] ;;
d) acolor=$lscols[di] ;;
l) acolor=$lscols[ln] ;;
p) acolor=$lscols[pi] ;;
s) acolor=$lscols[so] ;;
-) acolor=${lscols[${${aline[2]}:e}]}; # ${${aline[2]}:e} is the current file extention
[[ -z $acolor ]] && acolor=$lscols[fi] # unrecognized extention
[[ -z $acolor ]] && acolor=00 # sometimes "fi" isn't set in $LS_COLORS, so fall back to normal color
;;
*) acolor=00 ;;
esac
print -n -- "${aline[1]}\t" # print size (taken from du output)
print -n "\e[4${acolor}m" # activate color
print -n ${aline[2]} # print file name
print "\e[0m" # deactivate color
}
}
Este é o meu script antigo, também para zsh . Ele provavelmente é desnecessariamente complexo e é muito lento, já que para cada arquivo é emitido um único comando ls :
du_colored() {
typeset -a duout
duout=($(du -sh .* * | sort -hr | grep -v '^0'))
for i ({1..$#duout..2}) {
print -n "${duout[$i]}\t"
ls -d --color ${duout[$(($i+1))]}
}
}
- o
.*emzshnão corresponde a.ou.., mas arquivos como..foo, que serão perdidos com.[!.]* -
typeset -adeclara uma matriz - os loops for aver a matriz,
$irecebe valores de 1 em diante em etapas de 2
Aviso : Isso quebrará quando houver arquivos com espaços em branco ... Não tenho uma ideia melhor no momento.