FIND colorato?


14

È possibile ottenere un output colorato dal comando find ? Cioè, nel percorso di ogni elemento trovato, le directory sono blu, gli script eseguibili sono verdi, eccetera? Sto usando la versione 4.4.2 di GNU findutils .

Modifica - Per chiarire, ogni risultato sarebbe evidenziato in questo modo:

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

(se, ad esempio, in esecuzione find . -type f).


Ho scritto un sostituto per lo più compatibile alla ricerca chiamato bfsche ha questa funzionalità: github.com/tavianator/bfs
Tavian Barnes

Risposte:


10

AGGIORNAMENTO: Ho aggiunto un nuovo (diverso) script ... Ignacio Vazquez-Abrams aveva un punto: la domanda chiede davvero executable scripts are green, et cetera.. okay ... troverai un tale (prototipo) script alla fine di questa risposta.


Questa prima sezione (originale) riguarda grce grcat.

Questo dovrebbe funzionare; grc... (come ha sottolineato enzotib .. Il nome del pacchetto è grc... La sottoservizi utilizzata nell'esempio ègrcat

generic colouriser for everything

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

L'esempio seguente viene stampato

  • ./ in magenta
  • bin/cpp/ in ciano
  • bigint in bianco audace

Non ho ancora risolto completamente il modo in cui gestisce il file di configurazione, ma sembra che farà quello che vuoi (una volta domato) .. es. per un file senza sottodirectory e la sequenza di colori sembra non essere nella stessa sequenza delle espressioni.
Suppongo sia possibile (ma al momento sono un po 'impegnato) ...

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

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

Ecco la nuova sceneggiatura ispirata a Ignacio :)

Funziona se usi un singolo percorso come primo argomento find.
Ci sono problemi NON TESTATI in questo script. È solo un concetto.
Un problema è: Collegamenti simbolici ... acque torbide ...
Così com'è, stampa un ERRORquando incontra un tipo sconosciuto (es. Un collegamento simbolico), e quindi continua a processarlo.
Grazie enzotibper gli tputesempi.

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 

Hai dimenticato di dire che ti riferisci grcatall'utilità dal grcpacchetto :) All'inizio ho avuto delle difficoltà a capire cosa stai dicendo.
enzotib,

Mi è davvero mancato il fatto che l'OP volesse un colore diverso per diversi tipi di file.
enzotib,

Wow. Troppo lavoro per valerne la pena
Kolob Canyon,

6

Puoi usarlo -execper fare la maggior parte di questo (la mia soluzione non colora la parte della directory in modo diverso). Se hai il -printtuo findcomando, sostituiscilo con -exec ls --color -d; se stai usando la stampa implicita, aggiungila. Questo presuppone che lsl' --coloropzione supporti .

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

1
Non sono sicuro di chi abbia votato a favore di questo, ma non credo che abbiano finito di leggere la domanda (non che sto dicendo che questa risposta merita un downvote corrispondente) ...
Ignacio Vazquez-Abrams

4

Questo fa solo l'evidenziazione a due colori per percorso e nome file, non la cosa per tipo di file di ls:

Configura i colori grepdell'output nel modo giusto per la parte abbinata e non abbinata e abbina il nome file:

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


screen-grep-color

Potresti non voler sovrascrivere la variabile GREP_COLORS, quindi impostala solo per grep:

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

(Le definizioni della variabile deprecata GREP_COLORhanno meno priorità rispetto a quelle in GREP_COLORS)

Per i codici di colore, vedere colortest-16dal pacchetto colortest,
e la sezione "Set Graphics Rendition" in ANSI sequenze di comandi terminale .


-1

Mi è piaciuta l'idea -exec. L'ho usato per creare questa funzione:

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

Questo non sembra produrre colore ..?
Leo Ufimtsev,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.