Eu tenho um alias simples para listar o tamanho dos arquivos e pastas em cwd.
(incluindo dotfiles neste caso, ignorando tamanhos zero)
du -sh .[!.]* * | sort -hr | grep -v '^0'
que pode ser alcançado também com o find:
find .[!.]* * -maxdepth 0 -exec du -sh {} \; | sort -hr | grep -v '^0'
exemplo de saída:
// .ssh & .byobu are folders - .zsh* are files
// currently not able to distinguish them by type
...
32K .zshrc
25K .ssh
20K .zcompdump
19K .byobu
...
Como posso colorir os arquivos / diretórios na saída correspondente às cores ls? (LS_COLORS)
print
, mas fica mutilado com osystem
:du -sh .[!.]* * | sort -hr | grep -v '^0' | awk '{print $1;system( "ls -d --color '$2'") }'
grep --color=auto
... grep destacará um string de pesquisa / padrão na saída ... mas não divide entre arquivos & amp; pastas na saída usando o LS_COLORS. Obrigado pela dica de qualquer maneira :)Respostas:
este
zsh
script analisa$LS_COLORS
. Precisa apenas de umstat
chamar todos os arquivos e, portanto, é muito mais rápido do que a solução na parte inferior, que chamals
para cada arquivo. E lida com arquivos com espaços corretamente. (\n
ou\t
continuam a ser não permitido 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 de 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
o seguinte e use a nova função shellduc
para um coloridodu
saída:Este é o meu antigo roteiro, também para
zsh
. Provavelmente é desnecessariamente complexo e é muito lento, pois para cada arquivo um únicols
comando é emitido:.*
emzsh
vai não partida.
ou..
, mas arquivos como..foo
que será perdido com.[!.]*
typeset -a
declara uma matriz$i
leva valores de 1 em diante em etapas de 2Aviso : Isso vai quebrar mal quando houver arquivos com espaços em branco ... Eu não tenho uma ideia melhor no momento.
fonte
ls -a --color | sed -r "s/\x1B\[([0-9]{1,2}(;[0-9]{1,2})?)?[m|K]//g"
remove as cores - agora como podemos substituir odu
saída com a saída colorida dels -a --color
? :)$LS_COLORS
diretamente. Isso é muito mais rápido do que o meu hack de mais de meia-noite de ontem, já que ele precisa apenas registrar todos os arquivos em vez de executarls
.Isto é o que eu inventei para o bash - usa pv para mostrar o progresso da saída
Agora, o script pode ser transformado em uma única linha ... mas melhorarei a função adicionando sinalizadores, ou seja, 10 arquivos / pastas ou pastas maiores apenas.
fonte
:)
No entanto, eu tive que mudar a linha de leitura pararead -d '\n' -r -a ls_colored_array <<< $(ls -AF --color | grep -v @ | sed s'/[/\,*]$//'| xargs -n1 -L1)
para fazê-lo funcionar na planície bash (relacionado: superuser.com/questions/173337/… ). Infelizmente este script quebra em espaços em branco nos nomes dos arquivos. (Eu suponho que você precisa usar um contador para acessar todo o$ls_colored_array
elementos em vez de passar a matriz diretamente para o loop for).