Sistemi Operativi

Linux: colorare file e cartelle nel terminale

Se eseguiamo un banale comando "ls" nel terminale, possiamo vedere che file e cartelle vengono rappresentati sullo schermo con colori diversi:

$ ls
Cantanti     Immagini           Musica           Python     SoftMaker
Disegni_CAD  Lavori_Tavloletta  opt              Scaricati  Temi_Xed
Documenti    Lista              Pagine_Sito.txt  Scrivania  Video
Icone        Modelli            Pubblici         Sfondi

Personalmente il "Blu Grassetto" delle cartelle non mi piace affatto, lo trovo fastidioso per gli occhi, preferirei cambiarlo con qualcosa di più chiaro e leggibile.

Qualora il vostro terminale produca solo output in bianco e nero, si può attivare la modalità a colori impartendo questo comando:

$ ls --color

e una lista colorata simile alla precedente, apparirà ai vostri occhi.

Per poter vedere le impostazioni dei colori di sistema è sufficiente usare il comando "dircolors" (Manuale Online: dircolors) in questo modo:

$ dircolors --print-database
# Configuration file for dircolors, a utility to help you set the
# LS_COLORS environment variable used by GNU ls with the --color option.
# Copyright (C) 1996-2018 Free Software Foundation, Inc.
# Copying and distribution of this file, with or without modification,
# are permitted provided the copyright notice and this notice are preserved.
# The keywords COLOR, OPTIONS, and EIGHTBIT (honored by the
# slackware version of dircolors) are recognized but ignored.
# Below are TERM entries, which can be a glob patterns, to match
# against the TERM environment variable to determine if it is colorizable.
TERM Eterm
TERM ansi
TERM *color*
TERM con[0-9]*x[0-9]*
TERM cons25
TERM console
TERM cygwin
TERM dtterm
TERM gnome
TERM hurd
TERM jfbterm
TERM konsole
TERM kterm
TERM linux
TERM linux-c
TERM mlterm
TERM putty
TERM rxvt*
TERM screen*
TERM st
TERM terminator
TERM tmux*
TERM vt100
TERM xterm*
# Below are the color init strings for the basic file types. A color init
# string consists of one or more of the following numeric codes:
# 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
#NORMAL 00 # no color code at all
#FILE 00 # regular file: use no color at all
RESET 0 # reset to "normal" color
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.)
MULTIHARDLINK 00 # regular file with more than one link
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 ...
MISSING 00 # ... and the files they point to
SETUID 37;41 # file that is setuid (u+s)
SETGID 30;43 # file that is setgid (g+s)
CAPABILITY 30;41 # file with capability
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
# This is for files with execute permission:
EXEC 01;32
# List any file extensions like '.gz' or '.tar' that you would like ls
# to colorize below. Put the extension, a space, and the color init string.
# (and any comments you want to add after a '#')
# If you use DOS-style suffixes, you may want to uncomment the following:
#.cmd 01;32 # executables (bright green)
#.exe 01;32
#.com 01;32
#.btm 01;32
#.bat 01;32
# Or if you want to colorize scripts even if they do not have the
# executable bit actually set.
#.sh 01;32
#.csh 01;32
 # archives or compressed (bright red)
.tar 01;31
.tgz 01;31
.arc 01;31
.arj 01;31
.taz 01;31
.lha 01;31
.lz4 01;31
.lzh 01;31
.lzma 01;31
.tlz 01;31
.txz 01;31
.tzo 01;31
.t7z 01;31
.zip 01;31
.z 01;31
.dz 01;31
.gz 01;31
.lrz 01;31
.lz 01;31
.lzo 01;31
.xz 01;31
.zst 01;31
.tzst 01;31
.bz2 01;31
.bz 01;31
.tbz 01;31
.tbz2 01;31
.tz 01;31
.deb 01;31
.rpm 01;31
.jar 01;31
.war 01;31
.ear 01;31
.sar 01;31
.rar 01;31
.alz 01;31
.ace 01;31
.zoo 01;31
.cpio 01;31
.7z 01;31
.rz 01;31
.cab 01;31
.wim 01;31
.swm 01;31
.dwm 01;31
.esd 01;31
# image formats
.jpg 01;35
.jpeg 01;35
.mjpg 01;35
.mjpeg 01;35
.gif 01;35
.bmp 01;35
.pbm 01;35
.pgm 01;35
.ppm 01;35
.tga 01;35
.xbm 01;35
.xpm 01;35
.tif 01;35
.tiff 01;35
.png 01;35
.svg 01;35
.svgz 01;35
.mng 01;35
.pcx 01;35
.mov 01;35
.mpg 01;35
.mpeg 01;35
.m2v 01;35
.mkv 01;35
.webm 01;35
.ogm 01;35
.mp4 01;35
.m4v 01;35
.mp4v 01;35
.vob 01;35
.qt 01;35
.nuv 01;35
.wmv 01;35
.asf 01;35
.rm 01;35
.rmvb 01;35
.flc 01;35
.avi 01;35
.fli 01;35
.flv 01;35
.gl 01;35
.dl 01;35
.xcf 01;35
.xwd 01;35
.yuv 01;35
.cgm 01;35
.emf 01;35
# https://wiki.xiph.org/MIME_Types_and_File_Extensions
.ogv 01;35
.ogx 01;35
# audio formats
.aac 00;36
.au 00;36
.flac 00;36
.m4a 00;36
.mid 00;36
.midi 00;36
.mka 00;36
.mp3 00;36
.mpc 00;36
.ogg 00;36
.ra 00;36
.wav 00;36
# https://wiki.xiph.org/MIME_Types_and_File_Extensions
.oga 00;36
.opus 00;36
.spx 00;36
.xspf 00;36

Il quale visualizza il file di configurazione dir_colors, (Manuale Online: dir_colors), da non confondere con il comando eseguito in precedenza.

Oppure visualizzare il contenuto della variabile "LS_COLORS" in questo modoin questo modo, dove l'opzione '-b' indica di mostrare le impostazioni per la Bash:

$ dircolors -b
LS_COLORS='rs=0:di=01;34:ln=01;36:mh=00:pi=40;33:so=01;35:do=01;35:bd=40;33;01:cd=40;33;01:or=40;31;01:mi=00:su=37;41:sg=30;43:ca=30;41:tw=30;42:ow=34;42:st=37;44:ex=01;32:*.tar=01;31:*.tgz=01;31:*.arc=01;31:*.arj=01;31:*.taz=01;31:*.lha=01;31:*.lz4=01;31:*.lzh=01;31:*.lzma=01;31:*.tlz=01;31:*.txz=01;31:*.tzo=01;31:*.t7z=01;31:*.zip=01;31:*.z=01;31:*.dz=01;31:*.gz=01;31:*.lrz=01;31:*.lz=01;31:*.lzo=01;31:*.xz=01;31:*.zst=01;31:*.tzst=01;31:*.bz2=01;31:*.bz=01;31:*.tbz=01;31:*.tbz2=01;31:*.tz=01;31:*.deb=01;31:*.rpm=01;31:*.jar=01;31:*.war=01;31:*.ear=01;31:*.sar=01;31:*.rar=01;31:*.alz=01;31:*.ace=01;31:*.zoo=01;31:*.cpio=01;31:*.7z=01;31:*.rz=01;31:*.cab=01;31:*.wim=01;31:*.swm=01;31:*.dwm=01;31:*.esd=01;31:*.jpg=01;35:*.jpeg=01;35:*.mjpg=01;35:*.mjpeg=01;35:*.gif=01;35:*.bmp=01;35:*.pbm=01;35:*.pgm=01;35:*.ppm=01;35:*.tga=01;35:*.xbm=01;35:*.xpm=01;35:*.tif=01;35:*.tiff=01;35:*.png=01;35:*.svg=01;35:*.svgz=01;35:*.mng=01;35:*.pcx=01;35:*.mov=01;35:*.mpg=01;35:*.mpeg=01;35:*.m2v=01;35:*.mkv=01;35:*.webm=01;35:*.ogm=01;35:*.mp4=01;35:*.m4v=01;35:*.mp4v=01;35:*.vob=01;35:*.qt=01;35:*.nuv=01;35:*.wmv=01;35:*.asf=01;35:*.rm=01;35:*.rmvb=01;35:*.flc=01;35:*.avi=01;35:*.fli=01;35:*.flv=01;35:*.gl=01;35:*.dl=01;35:*.xcf=01;35:*.xwd=01;35:*.yuv=01;35:*.cgm=01;35:*.emf=01;35:*.ogv=01;35:*.ogx=01;35:*.aac=00;36:*.au=00;36:*.flac=00;36:*.m4a=00;36:*.mid=00;36:*.midi=00;36:*.mka=00;36:*.mp3=00;36:*.mpc=00;36:*.ogg=00;36:*.ra=00;36:*.wav=00;36:*.oga=00;36:*.opus=00;36:*.spx=00;36:*.xspf=00;36:';
export LS_COLORS

Si può ottenere lo stesso risultato anche in quest'altro modo:

$ echo $LS_COLORS
rs=0:di=01;34:ln=01;36:mh=00:pi=40;33:so=01;35:do=01;35:bd=40;33;01:cd=40;33;01:or=40;31;01:mi=00:su=37;41:sg=30;43:ca=30;41:tw=30;42:ow=34;42:st=37;44:ex=01;32:*.tar=01;31:*.tgz=01;31:*.arc=01;31:*.arj=01;31:*.taz=01;31:*.lha=01;31:*.lz4=01;31:*.lzh=01;31:*.lzma=01;31:*.tlz=01;31:*.txz=01;31:*.tzo=01;31:*.t7z=01;31:*.zip=01;31:*.z=01;31:*.dz=01;31:*.gz=01;31:*.lrz=01;31:*.lz=01;31:*.lzo=01;31:*.xz=01;31:*.zst=01;31:*.tzst=01;31:*.bz2=01;31:*.bz=01;31:*.tbz=01;31:*.tbz2=01;31:*.tz=01;31:*.deb=01;31:*.rpm=01;31:*.jar=01;31:*.war=01;31:*.ear=01;31:*.sar=01;31:*.rar=01;31:*.alz=01;31:*.ace=01;31:*.zoo=01;31:*.cpio=01;31:*.7z=01;31:*.rz=01;31:*.cab=01;31:*.wim=01;31:*.swm=01;31:*.dwm=01;31:*.esd=01;31:*.jpg=01;35:*.jpeg=01;35:*.mjpg=01;35:*.mjpeg=01;35:*.gif=01;35:*.bmp=01;35:*.pbm=01;35:*.pgm=01;35:*.ppm=01;35:*.tga=01;35:*.xbm=01;35:*.xpm=01;35:*.tif=01;35:*.tiff=01;35:*.png=01;35:*.svg=01;35:*.svgz=01;35:*.mng=01;35:*.pcx=01;35:*.mov=01;35:*.mpg=01;35:*.mpeg=01;35:*.m2v=01;35:*.mkv=01;35:*.webm=01;35:*.ogm=01;35:*.mp4=01;35:*.m4v=01;35:*.mp4v=01;35:*.vob=01;35:*.qt=01;35:*.nuv=01;35:*.wmv=01;35:*.asf=01;35:*.rm=01;35:*.rmvb=01;35:*.flc=01;35:*.avi=01;35:*.fli=01;35:*.flv=01;35:*.gl=01;35:*.dl=01;35:*.xcf=01;35:*.xwd=01;35:*.yuv=01;35:*.cgm=01;35:*.emf=01;35:*.ogv=01;35:*.ogx=01;35:*.aac=00;36:*.au=00;36:*.flac=00;36:*.m4a=00;36:*.mid=00;36:*.midi=00;36:*.mka=00;36:*.mp3=00;36:*.mpc=00;36:*.ogg=00;36:*.ra=00;36:*.wav=00;36:*.oga=00;36:*.opus=00;36:*.spx=00;36:*.xspf=00;36:

Osservando questa lunga lista di caratteri con un pò di attenzione, si può vedere che si tratta di una sequenza ben definita che rispetta questa sintassi:

sigla=valore_1;valore_2:

Dove [sigla] è un codice che identifica il tipo di file o cartella per il quale cambiare le impostazioni, seguita dal segno di ugiaglianza [=], a cui fanno seguito uno o più valori numerici [valore_1;valore_2] che indicano i nuovi codici colore, intervallati dal punto e virgola [;]. La sequenza termina con i due punti [:].

Le sigle utilizzate nella variabile "LS_COLORS" hanno i seguenti significati:

rs       RESET                    Ripristina no_color
bd       BLOCK                    Colore per dispositivi a blocco: file che rappresenta una periferica capace di effettuare operazioni di I/O per blocchi d dimensioni fissa di dati (Hard Disk, Key Usb
ca       CAPABILITY               Colore per file con capacità (vedere https://man7.org/linux/man-pages/man7/capabilities.7.html)
cd       CHAR                     Colore per dispositivi a caratteri:  file che rappresenta una periferica capace di effettuare operazioni di I/O per flussi di caratteri a dimensione variabile (modem e mouse su porta seriale, stampante su porta parallela)
di       DIR                      Colore per Directory
do       DOOR                     Colore per file Door
ec       END                      Costrutto per la definizione di colori in terminali non-ISO 6429 riferirsi al (Manuale Online: dir_colors) 
ex       EXEC                     Colore per File eseguibile
fi       FILE                     Colore per File regolare
lc       LEFT                     Costrutto per la definizione di colori in terminali non-ISO 6429 riferirsi al (Manuale Online: dir_colors) 
ln       LINK                     Colore per Link Simbolico
mi       MISSING                  Colore per file mancante (file inesistente che ha un collegamento simbolico che punta ad esso) se non specificato si usa il file regolare (fi)
mh       MULTIHARDLINK            Colore per Multi HardLink
no       NORMAL                   Colore di default (normal)
or       ORPHAN                   Colore per Link simbolico orfano (che punta ad un file inesistente) se omesso si usa il link simbolico (ln)
ow       OTHER_WRITABLE           Colore per Directory che ha permessi di scrittura per Others e non è  STICKY BIT [***](permessi -t, o+w)
pi       FIFO                     Colore usato per file FIFO
rc       RIGHT                    Costrutto per la definizione di colori in terminali non-ISO 6429 riferirsi al (Manuale Online: dir_colors) 
sg       SETGID                   Colore per File con set-group-ID (permessi g+s)
so       SOCKET                   Colore per file Socket
st       STICKY                   Colore per cartella con privilegi STICKY BIT [***] ma non Other Writeble (permessi +t, o-w)
su       SETUID                   Colore per File con set-user-ID (permessi u+s)
tw       STICKY_OTHER_WRITABLE    Colore per cartella con privilegi STICKY BIT [***] e con Other Writeble (permessi +t, o+w)
*.est    File con estensione      Colore per file la cui estensione è indicata nella sigla

[***] una directory STICKY BIT contiene file che possono essere rinominati o privati dei link a loro associati, soltanto dall'utente root, dal propietario della direrctory stessa o dal proprietario del file. In Linux lo STICKY BIT non ha effetto sui singoli file.

0 = colore predefinito
1 = grassetto
4 = sottolineato
5 = testo lampeggiante
7 = campo inverso
8 = invisibile

30 = nero
31 = rosso
32 = verde
33 = arancione/marrone
34 = blu 
35 = viola
36 = ciano
37 = grigio

90 = grigio scuro
91 = rosso chiaro
92 = verde chiaro
93 = giallo
94 = blu chiaro
95 = viola chiaro
96 = turchese
97 = bianco

40 = sfondo nero
41 = sfondo rosso
42 = sfondo verde 
43 = sfondo arancione/marrone
44 = sfondo blu
45 = sfondo viola
46 = sfondo ciano
47 = sfondo grigio

100 = sfondo grigio scuro
101 = sfondo rosso chiaro
102 = sfondo verde chiaro
103 = sfondo giallo
104 = sfondo blu chiaro
105 = sgondo viola chiaro
106 = sfondo turchese
107 = sfondo bianco

Effettuando alcune prove sul mio Linux Mint 21, ho constatato che i colori di primo piano scuri [30...37] risultano diversi dai chiari [90...97] soltanto se il parametro di stile è normale [0]; nel caso in cui sia grassetto [01], i colori chiari e scuri sono fra loro identici, pertanto:

  • di=00;33: stile normale colore testo arancione/marrone
  • di=00;93: stile normale colore testo giallo
  • di=01;33: stile grassetto colore testo giallo
  • di=01;93: stile grassetto colore testo giallo

Facciamo qualche esempio.

so=01;35:

I file di tipo Socket [so] sono rappresentati in grassetto [01] e di colore viola [35].

bd=40;33;01:

I file che rappresentano i Dispositivi a Blocchi [bd] sono rappresentati in grassetto [01] e di colore giallo [33] su sfondo nero [40].

*.jpg=01;35:

I file immagine con estensione .jpg [*.jpg] sono rappresentati in grassetto [01] e di colore viola [35].

Modificare la variabile "LS_COLORS"

Per provare nuove combinazioni di colori per file / cartelle si può semplicemente impartire il comando LS_COLORS="nuova_combinazione" in questo modo:

$ LS_COLORS="di=01;33"

in questo caso abbiamo imposto un giallo grassetto per le directory. Per verificare l'effettivo cambiamente è suficiente usare:

$ ls
Cantanti     Immagini           Musica           Python     SoftMaker
Disegni_CAD  Lavori_Tavloletta  opt              Scaricati  Temi_Xed
Documenti    Lista              Pagine_Sito.txt  Scrivania  Video
Icone        Modelli            Pubblici         Sfondi

Le modifiche però non sono permanenti, al successivo riavvio del terminale verranno ripristinate le vecchie impostazioni. Per rendere definitivi i cambiamenti è necessario modificare il file di configurazione dell'utente ~/.bashrc.

Si possono presentare due distinte situazioni:

1:- Il file ~/.bashrc non esiste nella nostra home

Per crearlo impartire nel terminale il seguente comando:

$ dircolors -b >> ~/.bashrc

Adesso editiamo il file con nano.

$ nano ~/.bashrc

Nano con ~/.bashrc creato da modificare

La prima riga, quella gialla nell'immagine, è lunghissima e va ben oltre il lato destro dello schermo.
Supponendo di voler colorare le directory di giallo e i file .txt di viola, entrambi in grassetto, si modifica la sigla di=01:34: in di=01;33: , alla fine della linea si aggiunge *.txt=01;33: , e infine dopo il comando export LS_COLORS , su una nuova linea, l'istruzione ls --color.

Nano con ~/.bashrc creato modificato

Salviamo le modifiche e usciamo da nano.

2:- Esiste un file ~/.bashrc nella nostra home

Editiamo il file con nano.

$ nano ~/.bashrc

Nano con ~/.bashrc esistente da modificare

Supponendo, come nell'esempio precedente, di voler colorare le directory di giallo e i file .txt di viola, entrambi in grassetto, si inserisce in coda al file appena aperto, proprio dopo l'ultima linea di codice, la seguente:

LS_COLORS="di=01;33:*.txt=01;35"

Nano con ~/.bashrc esistente modificato

Quindi salvare e uscire da nano e poi chiudere il terminale.

Al successivo riavvio, entrambe le situazioni sopra descritte, produrranno un output del comando "ls" con i nuovi colori.

$ ls
Cantanti     Immagini           Musica           Python     SoftMaker
Disegni_CAD  Lavori_Tavloletta  opt              Scaricati  Temi_Xed
Documenti    Lista              Pagine_Sito.txt  Scrivania  Video
Icone        Modelli            Pubblici         Sfondi