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
.*
emzsh
não corresponde a.
ou..
, mas arquivos como..foo
, que serão perdidos com.[!.]*
-
typeset -a
declara uma matriz - os loops for aver a matriz,
$i
recebe 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.