Suponho que você esteja usando ls --color=auto , que diz ls para usar cores no modo 'automático'. O modo 'Automático' informa less para ver se o STDOUT é um terminal e, em caso afirmativo, use cores, caso contrário, não use cores. Quando você canaliza ls para less , STDOUT não é um terminal, está conectado a STDIN de less , que é um canal normal.
A solução usa ls --color ou ls --color=always .
No entanto, agora isso leva a outro problema em potencial. Dependendo do seu less , ele pode não mostrar a cor, mas exibir os códigos de escape. A solução é usar less -R . Isso informa less para passar os códigos de escape para escapes de cor ANSI. Você não quer usar -r , pois isso causará problemas com linhas longas que se enrolam, pois menos não calcula corretamente o comprimento da linha.
Solução tão completa:
ls --color | less -R
Similarmente para tree :
tree -C | less -R