Vous pouvez utiliser $LS_COLORS
pour ce faire. Si votre version de ls
prend en charge la spécification des couleurs à l'aide de cette variable, vous pouvez définir la sortie par type de fichier. C'est un comportement intégré et très configurable. J'ai donc créé quelques fichiers pour faire une démonstration comme ceci:
for f in 9 8 7 6 5 4 3 2 1
do touch "${f}file" &&
ln -s ./"${f}file" ./"${f}filelink"
done
Alors maintenant je vais faire:
LS_COLORS='lc=:rc=:ec=:ln=\n\n\0HERE_THERE_BE_A_LINK>>\0:' \
ls -1 --color=always | cat
###OUTPUT###
1file
HERE_THERE_BE_A_LINK>>1filelink@
2file
HERE_THERE_BE_A_LINK>>2filelink@
3file
...
HERE_THERE_BE_A_LINK>>8filelink@
9file
...
Et les nuls sont là aussi ...
LS_COLORS='lc=:rc=:ec=:ln=\n\n\0HERE_THERE_BE_A_LINK>>\0:' \
ls -1 --color=always | sed -n l
1file$
$
$
\000HERE_THERE_BE_A_LINK>>\0001filelink@$
2file$
$
$
\000HERE_THERE_BE_A_LINK>>\0002filelink@$
3file$
...
Vous pouvez spécifier pour tout ou partie des types de fichiers. Le faire pour un seul type de fichier peut ne pas vous donner envie, car il ls
a incorporé certaines valeurs de compilation par défaut pour les échappements de terminal. Vous feriez beaucoup mieux d'adresser l'API comme une interface unique. Voici un petit moyen simple d'analyser et d'attribuer les dircolors
paramètres par défaut de l' environnement actuel :
LS_COLORS='rs=:no=//:lc=:rc=:ec=//:'$(
set -- di fi ln mh pi so do bd cd or su sg ca tw ow st ex
for fc do printf %s "$fc=/$fc//:"
done) ls -l --color=always | cat
Sa sortie dans mon répertoire personnel ressemble à ceci:
total 884
///-rw-r--r-- 1 mikeserv mikeserv 793 Jul 9 11:23 /fi//1/
//drwxr-xr-x 1 mikeserv mikeserv 574 Jun 24 16:50 /di//Desktop//
//-rw-r--r-- 1 mikeserv mikeserv 166 Jul 4 23:02 /fi//Terminology.log/
//-rw-r--r-- 1 mikeserv mikeserv 0 Jul 6 11:24 /fi//new
file/
//lrwxrwxrwx 1 mikeserv mikeserv 10 Jul 11 04:18 /ln//new
file
link/ -> /fi//./new
file/
//-rwxr-xr-x 1 mikeserv mikeserv 190 Jun 22 11:26 /ex//script.sh/*
//-rw-r--r-- 1 mikeserv mikeserv 433568 Jun 22 17:10 /fi//shot-2014-06-22_17-10-16.jpg/
//-rw-r--r-- 1 mikeserv mikeserv 68 Jun 17 19:59 /fi//target.txt/
Vous pouvez également exécuter cela avec cat -A
et la seule différence que vous rencontrerez est que vous verrez $
pour les nouvelles lignes - il n'y a pas de caractères non imprimables introduits par ls --color=always
avec cette configuration - seulement ce que vous voyez ici.
ls
insère ses sorties de terminal par défaut comme ceci:
${lc}${type_code}${rc}FILENAME${lc}${rs}${rc}
... où les valeurs par défaut pour $lc
(à gauche du code) , $rc
(à droite du code) et $rs
(réinitialiser) sont:
\033 - ESCAPE
m - END ESCAPE
0 - reset
...respectivement. ${type_code}
est utilisé pour remplacer les divers fi
(fichier normal - non défini par défaut) , di
(répertoire) , ln
(lien) et tous les autres types de fichiers que je connais. Il y a aussi $no
(normal) qui est aussi par défaut non défini et qui est ici représenté par //
le début de chaque ligne. Mon petit IFS=:
bloc simple fonctionne simplement en insérant le nom de chaque configurable en tant que sa propre valeur et en ajoutant une barre oblique ou deux - bien que les \0
octets NUL feraient aussi bien.
Par défaut, une autre ls
sera $rs
immédiatement insérée immédiatement avant sa première sortie $lc
, mais elle n'est pas représentée avec précision ici. Dans ce cas, j'ai spécifié $ec
(code de fin) qui remplace dans $rs
tous les cas - lorsqu'il est spécifié, vous n'obtenez pas de supplément $rs
entre $no
et ${type_code}
comme vous le feriez autrement - il ne présente que immédiatement après un nom de fichier et une fois au début de la sortie - comme vous pouvez le voir dans la barre oblique supplémentaire en tête de la première ligne.
Voici un extrait du mien $LS_COLORS
printf %s "$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: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:...
Et, en vérité, mon petit hack shell est probablement trop compliqué - il existe une interface largement disponible pour attribuer ces valeurs. Essayez dircolors -p
dans votre cli et info dircolors
pour plus d'informations à ce sujet.
Vous pouvez encapsuler les noms de fichiers dans des chaînes arbitraires. Vous pouvez les commenter si vous le souhaitez. Vous pouvez spécifier des comportements similaires basés uniquement sur l'extension de fichier. Il n'y a vraiment pas beaucoup de choses que vous ne pouvez pas spécifier de cette façon.
Maintenant, je n'invente pas tout cela non plus - je l'ai appris après être tombé sur le code source par accident.
Avec cette configuration particulière ls
émettra:
$no
- une fois par enregistrement au début de chaque enregistrement
${type_code}
- une fois immédiatement avant chaque nom de fichier pour inclure une abréviation du type du fichier et toujours sur la même ligne que et 7 champs délimités par des espaces après $no
ou immédiatement après une ->
dénotation de cible d'un lien symbolique.
$ec
- une fois immédiatement avant la toute première ligne et ensuite une seule fois immédiatement après chaque nom de fichier.
Toutes les autres valeurs sont vides.
Ce qui suit est un nombre nul ls
, et cette fois je vais utilisercat -A
, mais sans lui, il ressemblerait au dernier exemple:
LS_COLORS='rs=:no=\0//:lc=:rc=:ec=\0//:'$(
set -- di fi ln mh pi so do bd cd or su sg ca tw ow st ex
for fc do printf %s "$fc=/$fc//\0:"
done) ls -l --color=always | cat -A
total 884$
^@//^@//-rw-r--r-- 1 mikeserv mikeserv 793 Jul 9 11:23 /fi//^@1^@//$
^@//drwxr-xr-x 1 mikeserv mikeserv 574 Jun 24 16:50 /di//^@Desktop^@///$
^@//-rw-r--r-- 1 mikeserv mikeserv 166 Jul 4 23:02 /fi//^@Terminology.log^@//$
^@//-rw-r--r-- 1 mikeserv mikeserv 0 Jul 6 11:24 /fi//^@new$
file^@//$
^@//lrwxrwxrwx 1 mikeserv mikeserv 10 Jul 11 04:18 /ln//^@new$
file$
link^@// -> /fi//^@./new$
file^@//$
^@//-rwxr-xr-x 1 mikeserv mikeserv 190 Jun 22 11:26 /ex//^@script.sh^@//*$
^@//-rw-r--r-- 1 mikeserv mikeserv 433568 Jun 22 17:10 /fi//^@shot-2014-06-22_17-10-16.jpg^@//$
^@//-rw-r--r-- 1 mikeserv mikeserv 68 Jun 17 19:59 /fi//^@target.txt^@//$
Et donc pour supprimer de manière fiable tous les liens symboliques d'un-l
liste ong comme celle-ci, vous pouvez apporter une modification simple:
LS_COLORS='rs=:no=//:lc=:rc=:ec=/ :'$(
set -- di fi mh pi so do bd cd or su sg ca tw ow st ex
for fc do printf %s "$fc=$fc/:"
done)ln=///: ls -l --color=always | sed ':ln
\|///|{N;\|\n//|!bln};s|.*//||'
Mes résultats après la course ressemblent à ...
total 884
-rw-r--r-- 1 mikeserv mikeserv 793 Jul 9 11:23 fi/1/
drwxr-xr-x 1 mikeserv mikeserv 574 Jun 24 16:50 di/Desktop/ /
-rw-r--r-- 1 mikeserv mikeserv 166 Jul 4 23:02 fi/Terminology.log/
-rw-r--r-- 1 mikeserv mikeserv 0 Jul 6 11:24 fi/new
file/
-rwxr-xr-x 1 mikeserv mikeserv 190 Jun 22 11:26 ex/script.sh/ *
-rw-r--r-- 1 mikeserv mikeserv 433568 Jun 22 17:10 fi/shot-2014-06-22_17-10-16.jpg/
-rw-r--r-- 1 mikeserv mikeserv 68 Jun 17 19:59 fi/target.txt/
En utilisant une commande comme celle que je fais ci-dessus:
LSCOLORS=...$(...)fc1=///:fc2=///: ls ... | sed ...
... (où fc1
et fc2
sont les types de fichiers répertoriés après set --
dans le sous-shell) devrait servir à supprimer de manière fiable toutes les combinaisons de types de fichiers que vous pourriez souhaiter de la ls
sortie, quels que soient les caractères que les noms de fichiers peuvent contenir.