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.