Sortie FIND colorée?


14

Est-il possible d'obtenir une sortie colorée à partir de la commande find ? Autrement dit, dans le chemin de chaque élément trouvé, les répertoires sont bleus, les scripts exécutables sont verts, et cetera? J'utilise la version 4.4.2 de GNU findutils .

Modifier - Pour clarifier, chaque résultat serait mis en surbrillance comme suit:

./path/to/file.sh
  ^    ^  ^
  |    |  L green
   blue

(si, par exemple, en cours d'exécution find . -type f).


J'ai écrit un remplaçant compatible avec la plupart du temps appelé bfsqui a cette fonctionnalité: github.com/tavianator/bfs
Tavian Barnes

Réponses:


10

MISE À JOUR: J'ai ajouté un nouveau script (différent) ... Ignacio Vazquez-Abrams avait un point: la question demande vraiment executable scripts are green, et cetera... d'accord ... vous trouverez un tel script (prototype) à la fin de cette réponse.


Cette première section (originale) porte sur grcet grcat.

Cela devrait fonctionner; grc... (comme l' a souligné enzotib .. Le nom du package est grc... Le sous-utilitaire utilisé dans l'exemple estgrcat

generic colouriser for everything

generic colouriser, can be used to colourise logfiles,
output of commands, arbitrary text....
configured via regexp's.

L'exemple suivant s'imprime

  • ./ en magenta
  • bin/cpp/ en cyan
  • bigint en blanc gras

Je n'ai pas encore complètement trié la façon dont il gère le fichier de configuration, mais cela ressemble à ce qu'il fera ce que vous voulez (une fois que vous l'aurez apprivoisé) .. par exemple. pour un fichier sans sous-répertoire, et la séquence de couleurs ne semble pas être dans la même séquence que les expressions.
Je suppose que c'est possible (mais je suis un peu occupé en ce moment) ...

echo "# my config file
regexp=(\./)(.*/)([^/]+)
colours=bold white,magenta,cyan
">$HOME/.grc/findhi

find . -maxdepth 3 -name '*' | grcat findhi

Voici le nouveau script inspiré d'Ignacio :)

Cela fonctionne si vous utilisez un seul chemin d'accès comme premier argument find.
Il y a des problèmes UNTESTED dans ce script. Ce n'est qu'un concept.
Un problème est: Liens symboliques ... eaux troubles ...
En l'état, il imprime un ERRORlorsqu'il rencontre un type inconnu (par exemple, un lien symbolique), puis continue le traitement après cela.
Merci enzotibpour les tputexemples.

dircol=$(tput bold ;tput setaf 4)
coloff=$(tput sgr0)

root="$HOME"       # define path here, not in 'find` arg
root="${root:-.}"  # default to '.'
root="${root%/}/"  # add trailing '/'
#
find "$root" -maxdepth 1 -name '*' -printf "%y %P\n" | 
  while read -r line ;do
    case $line in 
       d   ) printf "%s\n" "$dircol$root$coloff";;  
       d\ *) printf "%s\n" "$dircol$root${line:2}$coloff";;  
       f\ *) l="$root${line:2}"
             d="${l%/*}/"
             f="${l##*/}"
             cd -P "$d" 
             printf "%s" "$dircol$d$coloff"  
             ls --color=always -R1 "$f"
             cd - >/dev/null
             ;; 
          *) printf "ERROR - type not yet catered for\n";;  
    esac
  done 

Vous avez oublié de dire que vous faites référence à l' grcatutilitaire du grcpackage :) Au début, j'ai eu quelques difficultés à comprendre ce que vous dites.
enzotib

J'ai vraiment manqué le fait que l'OP souhaite une couleur différente pour différents types de fichiers.
enzotib

Sensationnel. Trop de travail pour en valoir la peine
Kolob Canyon

6

Vous pouvez utiliser -execpour faire la plupart de cela (ma solution ne colore pas la partie répertoire différemment). Si vous en avez -printdans votre findcommande, remplacez-la par -exec ls --color -d; si vous utilisez l'impression implicite, ajoutez cela. Cela suppose que votre lsprend en charge l' --coloroption.

find . -exec ls --color -d {} \;

1
Je ne sais pas trop qui a voté pour cela, mais je ne pense pas qu'ils aient fini de lire la question (pas que je dis que cette réponse mérite un downvote correspondant) ...
Ignacio Vazquez-Abrams

4

Cela ne fait que mettre en évidence deux couleurs pour le chemin et le nom de fichier, pas la chose par type de fichier de ls:

Configurez les couleurs de grepsortie de la bonne manière pour la partie correspondante et non correspondante, et faites correspondre le nom de fichier:

$ export GREP_COLORS="sl=0;33;49:ms=1;34;49"
$ find /etc/ -type f | head | grep --color=always '^\|[^/]*$'


couleur écran-grep

Vous pouvez ne pas vouloir écraser la variable GREP_COLORS, alors ne la définissez que pour grep:

$ find /etc/ -type f | head | GREP_COLORS="sl=0;33;49:ms=1;34;49" grep --color=always '^\|[^/]*$'

(Les définitions de la variable obsolète GREP_COLORont moins de priorité que celles de GREP_COLORS)

Pour les codes de couleur, voir colortest-16de l'emballage colortest,
et la section « Set Graphics Rendition » dans des séquences de commandes de terminal ANSI .


-1

J'ai aimé l'idée -exec. Je l'ai utilisé pour créer cette fonction:

function ff {
    find . -name $1 -exec ls -G -d {} \;
}

Cela ne semble pas produire de couleur ..?
Leo Ufimtsev
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.