What do the different colors mean in ls?
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?
Solution 1:
- Blue: Directory
- Green: Executable or recognized data file
- Cyan (Sky Blue): Symbolic link file
- Yellow with black background: Device
- Magenta (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:
Note:
- For more information, type
man dir_colors
in terminal.
Solution 2:
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:
aac, au, flac, mid, midi, mka, mp3, mpc, ogg, ra, wav, axa, oga, spx, xspf.
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.
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.
Solution 3:
This expands on Karthick87's answer.
Full list, with the default setup
-
Uncolored (white): file or non-filename text (e.g. permissions in the output of
ls -l
) or multi-hardlink file - 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
Note that bold red looks orange, black looks dark grey, cyan looks blue/green, and bold magenta looks purple/pink/lavender.
Script to show colors
#!/bin/bash
# For LS_COLORS, print type and description in the relevant color.
declare -A descriptions=(
[bd]="block device"
[ca]="file with capability"
[cd]="character device"
[di]="directory"
[do]="door"
[ex]="executable file"
[fi]="regular file"
[ln]="symbolic link"
[mh]="multi-hardlink"
[mi]="missing file"
[no]="normal non-filename text"
[or]="orphan symlink"
[ow]="other-writable directory"
[pi]="named pipe, AKA FIFO"
[rs]="reset to no color"
[sg]="set-group-ID"
[so]="socket"
[st]="sticky directory"
[su]="set-user-ID"
[tw]="sticky and other-writable directory"
)
IFS=:
for ls_color in $LS_COLORS; do
color="${ls_color#*=}"
type="${ls_color%=*}"
# Add description for named types.
desc="${descriptions[$type]}"
# Separate each color with a newline.
if [[ $color_prev ]] && [[ $color != "$color_prev" ]]; then
echo
fi
printf "\e[%sm%s%s\e[m " "$color" "$type" "${desc:+ ($desc)}"
# For next loop
color_prev="$color"
done
echo
Output with default setup:
Output with my setup (custom dircolors and custom Solarized terminal theme):
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.