Você tem dois problemas aqui
-
ls -G
pára a saída em cores quando a saída não vai para um terminal (aqui para um pipe). O GNUls
precisa ser passado a uma opção--color=always
e, para o BSDls
, é necessário definir o ambienteCLICOLOR_FORCE
como um valor não vazio para que ele sempre imprima em cores. -
As cores são obtidas através da saída de sequências de escape que são uma sequência de caracteres como
<ESC>[31m
para o primeiro plano vermelho. Isso não tem largura quando exibido, mas no que se refere acut
, são 5 caracteres que contam até$COLUMNS
.Portanto, você não pode usar
cut
aqui, pois você precisa ignorar essas sequências de escape no cálculo. Em vez disso, você poderia fazer algo como:esc=$'\e' CLICOLOR_FORCE=1 ls -l | sed "s/\(\(\($esc\[[0-9;]*m\)\{0,1\}.\{0,1\}\)\{$COLUMNS\}\).*/${esc}[m/"
Lá,
sed
faz a contagem e adiciona um\e[m
para reverter a cor para o padrão, caso ela tenha sido cortada no processo.
Alternativamente, você poderia dizer ao seu terminal para não embrulhar e fazer o corte com:
tput rmam
( tput smam
para restaurar)
Você pode definir uma função como:
nowrap() {
[ -t 1 ] && tput rmam
"$@"; local ret="$?"
[ -t 1 ] && tput smam
return "$ret"
}
alias nowrap='nowrap '
(a parte alias
para forçar a expansão de alias após nowrap
), para ser chamada como:
nowrap ls -l ...