127

When I have dircolors defined life is full of... color.

When I pipe ls through less to scroll around I lose the colors.

Any suggestions?

HopelessN00b
  • 53,385
  • 32
  • 133
  • 208
MathewC
  • 6,877
  • 9
  • 38
  • 53

2 Answers2

122

Most likely your ls is aliased to ls --color=auto, which tells ls to only use colors when its output is a tty. If you do ls --color (which is morally equivalent to ls --color=always), that will force it to turn on colors.

You could also change your alias to do that, but I wouldn't really call that a good idea. Better to make a different alias with --color.

less needs -R too, which causes it to output the raw control characters.

mekb
  • 103
  • 6
chaos
  • 7,463
  • 4
  • 33
  • 49
  • 5
    Why would you not call it a good idea to alias ls to `ls --color` or `ls --color=always`, for that matter? – j08lue Apr 08 '15 at 13:38
  • 11
    @j08lue if you pipe through a command that doesn't handle color, you get some junk characters that may mess up the command. For example, I did `ls --color=always | less` and got: `ESC[01;32mexecute_once.shESC[0m` (I know this is old and you probably don't care, but for future visitors, this may be useful) – Ryan Amos Jun 30 '15 at 16:51
65

Try less with the -R option like this:

command | less -R

This works for me in a one-liner like this:

ls -la | grep --color=always bash | less -r

And like this too:

ls --color | less -R

But you have to tweak the primary output (the output of ls in this case) a bit with the --color parameter.

wzzrd
  • 10,269
  • 2
  • 32
  • 47