No colored output in less for the ls command

If I run ls I get colored output which I find pretty handy for quickly getting a glance of the kind of file. When I try to pipe it to less even with the -r and -R flags the coloring always get lost. I am using zsh version 5.0.7. Any ideas? Thanks.

edit: I am on OS X.

Asked By: nunos


The problem most probably is that your ls program has set option --color=auto which basically means that output should be coloured only if it is connected to terminal, otherwise (output connected to a pipe or a file) no colors are emitted.

If you want to have colors is such cases you should set --color option to always, so try

ls --color=always | less -R

If this behaviour is what you expect all the time then just create alias:

alias ls='ls --color=always'
Answered By: jimmij

I can’t comment @jimmij ‘s answer, because I have less than 50 rep, but I would like to explain what worked for me in Bash.

If you run

$ man ls | grep color

you will see all the entries of the man-page for your specific shell environment (in our case bash).

For me the following adjustment did the trick:

$ alias ls='ls -G'
Answered By: titus.andronicus

This is by design: programs that produce colored output typically do so only when their output goes to a terminal, not when it’s sent to a pipe or to a regular file. The reason is that data sent on a terminal is presumably read by a human, whereas data piped to a program or written to a file is likely to be parsed by some program, so it shouldn’t contain extraneous content like color-changing escape sequences.

GNU ls displays colored output on a terminal when you pass the option --color (or --color=auto). To force colored output regardless of the file type of the standard output, pass --color=always or --color=yes (they’re synonyms). This convention has been followed by other commands, like GNU grep, FreeBSD grep, git diff, etc.

ls --colors=yes -l | less

With the FreeBSD version of ls (also found on OSX, and available as the colorls port on OpenBSD and NetBSD), pass the option -G to display colors when the output is a terminal. Set the environment CLICOLOR_FORCE to display colors regardless of the output file type.

CLICOLOR_FORCE=1 ls -l | less
Categories: Answers Tags: , , , ,
Answers are sorted by their score. The answer accepted by the question owner as the best is marked with
at the top-right corner.