What do the different colours in Ubuntu's ls command mean? For example, when I type the ls command in one of my folders, I get one of the files in light green, the other (which is a folder) in blue with green highlighting.

What do those colours mean, and there is any manual about all the colours?

up vote 325 down vote accepted
  • Blue: Directory
  • Green: Executable or recognized data file
  • Sky Blue: Symbolic link file
  • Yellow with black background: Device
  • Pink: Graphic image file
  • Red: Archive file
  • Red with black background: Broken link

For your Information:

  • To turn the color off, you have to comment out the following lines in .bashrc.

    # enable color support of ls and also add handy aliases
    #if [ -x /usr/bin/dircolors ]; then
    #    test -r ~/.dircolors && eval "$(dircolors -b ~/.dircolors)" || eval "$(dircolors -b)"
    #    alias ls='ls --color=auto'
    #    #alias dir='dir --color=auto'
    #    #alias vdir='vdir --color=auto'
    #
    #    alias grep='grep --color=auto'
    #    alias fgrep='fgrep --color=auto'
    #    alias egrep='egrep --color=auto'
    #fi
    
  • Also if you want to see your own bash color meanings,then copy/paste the following codes in your terminal.

    eval $(echo "no:global default;fi:normal file;di:directory;ln:symbolic link;pi:named pipe;so:socket;do:door;bd:block device;cd:character device;or:orphan symlink;mi:missing file;su:set uid;sg:set gid;tw:sticky other writable;ow:other writable;st:sticky;ex:executable;"|sed -e 's/:/="/g; s/\;/"\n/g')           
    {      
      IFS=:     
      for i in $LS_COLORS     
      do        
        echo -e "\e[${i#*=}m$( x=${i%=*}; [ "${!x}" ] && echo "${!x}" || echo "$x" )\e[m" 
      done       
    } 
    

    Output:
    alt text

Note:

You can find out what colours ls uses by looking at the $LS_COLORS variable:

  • Turquoise: audio files1
  • Bright Red: Archives and compressed files2
  • Purple: images and videos3

In addition, files are colourised by attributes:

alt text


  1. aac, au, flac, mid, midi, mka, mp3, mpc, ogg, ra, wav, axa, oga, spx, xspf.

  2. tar, tgz, arj, taz, lzh, lzma, tlz, txz, zip, z, Z, dz, gz, lz, xz, bz2, bz, tbz, tbz2, tz, deb, rpm, jar, rar, ace, zoo, cpio, 7z, rz.

  3. jpg, jpeg, gif, bmp, pbm, pgm, ppm, tga, xbm, xpm, tif, tiff, png, svg, svgz, mng, pcx, mov, mpg, mpeg, m2v, mkv, ogm, mp4, m4v, mp4v, vob, qt, nuv, wmv, asf, rm, rmvb, flc, avi, fli, flv, gl, dl, xcf, xwd, yuv, cgm, emf, axv, anx, ogv, ogx.


All this information is contained in the output of dircolors --print-database, but its formatting is rather unreadable.

Here's a technical explanation of what's happening:

Example:

CHR 40;33;01

The colour code consists of three parts:

  • The first part before the semicolon represents the text style.

    • 00=none, 01=bold, 04=underscore, 05=blink, 07=reverse, 08=concealed.
  • The second and third part are the colour and the background color:

    • 30=black, 31=red, 32=green, 33=yellow, 34=blue, 35=magenta, 36=cyan, 37=white.

Each part can be omitted, assuming starting on the left. i.e. "01" means bold, "01;31" means bold and red. And you would get your terminal to print in colour by escaping the instruction with \33[ and ending it with an m. 33, or 1B in hexadecimal, is the ASCII sign "ESCAPE" (a special character in the ASCII character set). Example:

"\33[1;31mHello World\33[m"

Prints "Hello World" in bright red.

The command ls with the argument --color=auto (on Ubuntu, ls is an alias for ls --color=auto) goes through all the file names and tries first to match different types, like Executable, Pipe and so on. It then tries to match regular expressions like *.wav and prints the resulting filename, enclosed in these colour-changing instructions for bash.

  • Thanks! I was looking at a Git topology visualization question and wondered why some of the characters were being printed. – pdp Jul 4 '15 at 8:11

If you type dircolors (echo $LS_COLORS also works) from command line you will get a list of codes and colors for lots of filetypes in 1 line. dircolors --print-database shows them 1 line at a time. Here is a short list (I tried to put in the most important ones). At the bottom there is an explanation about what the different codes at the end of each lines represents:

NORMAL 00 # global default, although everything should be something.
FILE 00 # normal file
DIR 01;34 # directory
LINK 01;36 # symbolic link. (If you set this to 'target' instead of a
 # numerical value, the color is as for the file pointed to.)
FIFO 40;33 # pipe
SOCK 01;35 # socket
DOOR 01;35 # door
BLK 40;33;01 # block device driver
CHR 40;33;01 # character device driver
ORPHAN 40;31;01 # symlink to nonexistent file, or non-stat'able file
SETUID 37;41 # file that is setuid (u+s)
SETGID 30;43 # file that is setgid (g+s)
STICKY_OTHER_WRITABLE 30;42 # dir that is sticky and other-writable (+t,o+w)
OTHER_WRITABLE 34;42 # dir that is other-writable (o+w) and not sticky
STICKY 37;44 # dir with the sticky bit set (+t) and not other-writable
# archives or compressed (bright red)
.tar 01;31
.tgz 01;31
# image formats
.jpg 01;35
.jpeg 01;35
.gif 01;35
.bmp 01;35
# audio formats
.aac 00;36
.flac 00;36
.ogg 00;36
  • Attribute codes: 00=none 01=bold 04=underscore 05=blink 07=reverse 08=concealed
  • Text color codes: 30=black 31=red 32=green 33=yellow 34=blue 35=magenta 36=cyan 37=white
  • Background color codes: 40=black 41=red 42=green 43=yellow 44=blue 45=magenta 46=cyan 47=white

If you want to play around with this here is an example on how to set a color for a file:

export LS_COLORS=$LS_COLORS:"*.ogg=01;35":"*.mp3=01;35"  

This will set *.ogg and .mp3 to bold magenta. And if you put it in your .bashrc file it will become permanent.

  • 2
    Hey maybe someone else comes with a better answer. Btw you got me over 15k with this upvote ;) – Rinzwind Sep 14 '11 at 8:29
  • rock on! You got yourself there... Thanks again though, I did a /"string" to search up on some of the colors I was unsure about – user784637 Sep 14 '11 at 8:38
  • This (excellent) answer was merged, in case you're wondering about the dates. :-) – Stefano Palazzo Sep 14 '11 at 10:06
  • @Rinzwind, so to set a color for pdf file, the process is to use export? Is it possible to simply add one extension in the default LS_COLORS variable? – Sigur Jan 28 '16 at 18:14

None of the answers here include the 256 color options in the latest versions of Ubuntu. I'm color deficient (some colors give me trouble near each other) so the default blue directory on black is real hard for me to read. What follows is my research to change that.

Type dircolors -p |less to see your current color code.

The default .bashrc should already be configured not only to take advantage of the system color code, but also one in ~/.dircolors so dump the dircolors output to .dircolor so you can start with that using this command. dircolors -p > ~/.dircolors

Alternative: pick up a very similar 256 color dircolors from seebi's solarized project.

Grab this colortest script and run it with the command colortest -w so you can see all the colors at once. Choose a color. I like the orange #208. I want that to be the text color so using this info on extended color codes, I can apply that.

So you have a color, now what. First we have to create the string.

The first number will be an attribute code, most likely 00, but if you want it to blink go with 05:

Pick an attribute code: 00=none 01=bold 04=underscore 05=blink 07=reverse 08=concealed

Next pick append ;38;5; to that attribute code to indicate your text color to get 00;38;5; and then append your color. I picked 208 so I get 00;38;5;208.

If you want to also put a background on it, pick another color (let's say 56) with the colortest script and the append ;48;5; for the background and 56 for the color to get a total string of 00;38;5;208;48;5;56.

So now you have it, what do you do with it?

vim ~/.dircolors and find the section you want to change (for me that is DIR) to the string we determined above "00;38;5;208".

This won't apply immediately, you'll need to load the config. Use dircolors ~/.dircolors to the get code to set your LS_COLORS variable. You could just paste that into your terminal session or you can close your terminal and reopen it. You could also pipe that into a file and run it as a shell script.

You can do this same procedure with 16 colors. You don't need the special ;38;5 or ;48;5 stuff. Just toss the numbers into the string and enjoy the simplicity.

Thanks to Dan and seebi for their notes and code on this.

This expands on Karthick87's answer.


With the default setup

  • Uncolored (white): file or non-filename text (e.g. permissions in the output of ls -l)
  • Bold blue: directory
  • Bold cyan: symbolic link
  • Bold green: executable file
  • Bold red: archive file
  • Bold magenta: image file, video, graphic, etc. or door or socket
  • Cyan: audio file
  • Yellow with black background: pipe (AKA FIFO)
  • Bold yellow with black background: block device or character device
  • Bold red with black background: orphan symlink or missing file
  • Uncolored with red background: set-user-ID file
  • Black with yellow background: set-group-ID file
  • Black with red background: file with capability
  • White with blue background: sticky directory
  • Blue with green background: other-writable directory
  • Black with green background: sticky and other-writable directory

Script to show colors

#!/bin/bash
# For LS_COLORS, print type and description in the relevant color.

IFS=:
for ls_color in $LS_COLORS; do
    color="${ls_color#*=}"
    type="${ls_color%=*}"

    # Add descriptions for named types.
    case "$type" in
    bd) type+=" (block device)" ;;
    ca) type+=" (file with capability)" ;;
    cd) type+=" (character device)" ;;
    di) type+=" (directory)" ;;
    do) type+=" (door)" ;;
    ex) type+=" (executable file)" ;;
    fi) type+=" (regular file)" ;;
    ln) type+=" (symbolic link)" ;;
    mh) type+=" (multi-hardlink)" ;;
    mi) type+=" (missing file)" ;;
    no) type+=" (normal non-filename text)" ;;
    or) type+=" (orphan symlink)" ;;
    ow) type+=" (other-writable directory)" ;;
    pi) type+=" (named pipe, AKA FIFO)" ;;
    rs) type+=" (reset to no color)" ;;
    sg) type+=" (set-group-ID)" ;;
    so) type+=" (socket)" ;;
    st) type+=" (sticky directory)" ;;
    su) type+=" (set-user-ID)" ;;
    tw) type+=" (sticky and other-writable directory)" ;;
    esac

    # Separate each color with a newline.
    if [[ $color_prev ]] && [[ $color != $color_prev ]]; then
        echo
    fi

    printf "\e[%sm%s\e[m " "$color" "$type"

    # For next loop
    color_prev="$color"
done
echo

Output with default setup:

gnome-terminal screenshot

Output with my setup (custom dircolors and custom Solarized terminal theme):

gnome-terminal screenshot

I got the descriptions from dircolors -p and man dir_colors, and filled in the gaps with my own research.

The colors and descriptions are the same from 14.04 to 17.10.

  • How did you know rs means RESET, mh means MULTIHARDLINK, ca means CAPABILITY etc? – Fredrick Gauss Oct 4 '17 at 8:36
  • @FredrickGauss As I wrote in the answer, I got descriptions from running dircolors -p. – wjandrea Oct 4 '17 at 16:04
  • dircolors -p does not say rs is RESET 0 # reset to "normal" color . – Fredrick Gauss Oct 4 '17 at 16:38
  • @FredrickGauss Not explicitly, but "RESET" is the only one that can be abbreviated as "rs", and the color (0) matches. – wjandrea Oct 4 '17 at 16:45
  • I am asking that. You just estimate, infer. – Fredrick Gauss Oct 4 '17 at 16:47

Your Answer

 

By clicking "Post Your Answer", you acknowledge that you have read our updated terms of service, privacy policy and cookie policy, and that your continued use of the website is subject to these policies.

Not the answer you're looking for? Browse other questions tagged or ask your own question.