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:
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
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.
Salviamo le modifiche e usciamo da nano.
2:- Esiste un file ~/.bashrc nella nostra home
Editiamo il file con nano.
$ nano ~/.bashrc
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"
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