Eu tenho essa função em .bashrc
:
{ ls -lhNGhgF --color=always --group-directories-first --time-style="+%d-%b-%Y $newline%H:%M" | awk '
{
$3 ="\033[1;31m" $3 "\033[0m";
$4 ="\033[1;48;5;196m" $4 "\033[0m";
$5 ="\033[1;30m" $5 "\033[0m";
print;
}
'
}
Funciona, mas as colunas da saída não estão alinhadas. Como posso consertar isso?
Preâmbulo
Este é um caso em que a análise da saída de
ls
é justificada. É errado usarls
para obter dados para programas . Aqui você deseja obter uma saída legível por humanos e torná-la mais legível para humanos . Isso é muito menos crítico; se algo der errado, você provavelmente notará imediatamente.As implementações de
ls
podem gerar uma saída ligeiramente diferente, mesmo que ofereçam suporte a todas as opções de que você precisa. Por esse motivo, qualquer solução para um problema desse tipo deve ser adaptada às necessidades de cada umls
.Só para constar: meu testbed é o Kubuntu 18.04.2 LTS.
Código
Use esta função:
Explicação:
Primeiro, armazeno as strings de que precisamos como variáveis locais. Estou usando
$''
uma sintaxe que funciona no Bash, exceto pelac5
qual é (por motivos educacionais) recuperada da saída deprintf
. O ponto é que o método withprintf
funcionará mesmo emsh
, portanto, se você precisar que essa função funcione em um shell que não entenda o Bash's$''
, você saberá o caminho.Em seguida, estou usando
sed
expressões regulares estendidas para pesquisar e substituir. Qualquer coluna, exceto a última, pode ser correspondida,[^ ]+ +
o que significa "pelo menos um não-espaço e pelo menos um espaço". Na substituição, o que for correspondido pelo 1º conjunto de parênteses ((…)
) é referido como\1
; pelo 2º set – como\2
; e assim por diante. Dessa forma, posso combinar as cinco primeiras colunas e "substituí-las" por si mesmas usando\1\2\3\4\5
. Esta única operação é sem operação, até que eu injete strings armazenadas anteriormente nos lugares certos:Notas:
Você deve ter notado que as colunas 4 e 5 são correspondidas em
([^ ]+)( +[^ ]+ +)
vez de universais([^ ]+ +)
repetidas duas vezes. Se fosse([^ ]+ +)([^ ]+ +)
então os caracteres de espaço entre essas colunas pertenceriam logicamente à 4ª, portanto seriam impressos em vermelho por causa da cor de fundo que você escolheu para a 4ª coluna. Incluí-los na 5ª coluna resolve o problema.Não injeto nada entre a 1ª e a 2ª coluna, então poderia combinar ambas com um conjunto de parênteses (ou seja,
([^ ]+ +[^ ]+ +)
) e a string de substituição ficaria assim:\1$c3\2$c0$c4\3$c0$c5\4$c0
. Em seguida\1
, referir-se-ia a duas colunas,\4
referir-se-ia à 5ª. Decidi evitar confusão e manter esses números coerentes com a numeração natural das colunas.command ls
garante que a função não execute uma função chamadals
, mesmo que haja uma definida. Isso é excessivo aqui, mas se você decidir renomearlsi
parals
,command
ajudará a evitar a recursão infinita indesejada.Eu adicionei
"$@"
no final da minhals
invocação para que eu possa fazerlsi /
,lsi /dev/sd*
etc. Observe que isso também me permite especificar opções adicionais que podem funcionar bem (por exemplolsi -a
) ou não tão bem (elas podem mudar as colunas sem mudar a coloração, por exemplolsi -i
) .Compactei as opções. Com
-g
você não precisa-l
; e você teve-h
duas vezes; e acho-N
irrelevante ao usarls
em um cachimbo. Mesmo assim o seuls
pode variar, opções em excesso só prejudicam a elegância. Use o que funcionar para você.