Existem dois problemas aqui. Primeiro de tudo, o que você está fazendo é absolutamente o caminho errado para processar os arquivos em um diretório e vai quebrar se seus nomes de arquivo contiverem novas linhas ou outra estranheza. Consulte o link para saber mais.
Dito isto, as cores de ls
são opcionais. Em muitas distribuições do Linux, o comando ls
é na verdade com alias para ls --color=tty
, o que habilita cores quando ls
está imprimindo para um tty (em oposição a um while
loop, por exemplo). No entanto, os aliases não estão habilitados em scripts normalmente, portanto, quando você executar ls
do seu script, estará executando o% normalls
sem cores.
Então, a primeira solução seria chamar ls --color=always
. Isso vai deixar você ecoar com cores. No entanto, isso é quase certamente uma má idéia, como mencionei no primeiro parágrafo. Por um lado, se você quiser apenas imprimir cada linha, por que você simplesmente não executa ls
e esquece o laço while
?
Se você precisar processar os arquivos por algum outro motivo e ainda precisar usar ls
, use globbing para obter a lista de arquivos e, em seguida, execute ls
em cada um deles manualmente:
for file in *; do
ls -d --color=always -- "$file"
done
Isso não interromperá nomes de arquivos estranhos e ainda mostrará as cores conforme solicitado.