Color ENCONTRAR salida?

14

¿Es posible obtener resultados coloreados del comando find ? Es decir, en la ruta de cada elemento encontrado, los directorios son azules, los scripts ejecutables son verdes, etc. Estoy usando la versión 4.4.2 de GNU findutils .

Editar: para aclarar, cada resultado se resaltaría así:

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

(si, por ejemplo, ejecutando find . -type f).

wes
fuente
Escribí un reemplazo llamado compatible en su mayoría llamado bfsque tiene esta funcionalidad: github.com/tavianator/bfs
Tavian Barnes

Respuestas:

10

ACTUALIZACIÓN: agregué un nuevo guión (diferente) ... Ignacio Vazquez-Abrams tenía un punto: la pregunta realmente pregunta executable scripts are green, et cetera... bueno ... encontrarás un guión (prototipo) al final de esta respuesta.


Esta primera sección (original) trata sobre grcy grcat.

Esto debería funcionar; grc... (como ha señalado enzotib ... El nombre del paquete es grc... La subutilidad utilizada en el ejemplo, esgrcat

generic colouriser for everything

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

El siguiente ejemplo imprime

  • ./ en magenta
  • bin/cpp/ en cian
  • bigint en blanco negrita

Todavía no he resuelto por completo cómo maneja su archivo de configuración, pero parece que hará lo que quiera (una vez que lo domestique) ... por ejemplo. para un archivo sin subdirectorio, y la secuencia de colores parece no estar en la misma secuencia que las expresiones.
Supongo que es posible (pero estoy un poco ocupado en este momento) ...

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

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

Aquí está el nuevo guión inspirado en Ignacio :)

Esto funciona si usa una sola ruta como primer argumento para find.
Hay problemas no probados en este script. Es solo concepto.
Un problema es: Enlaces simbólicos ... aguas turbias ...
Tal como está, imprime un ERRORcuando encuentra un tipo desconocido (por ejemplo, un enlace simbólico), y luego continúa procesando más allá de eso.
Gracias a enzotibpor los tputejemplos.

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 
Peter.O
fuente
Olvidó decir que se refiere a la grcatutilidad del grcpaquete :) Al principio tuve algunas dificultades para entender lo que está diciendo.
enzotib
Realmente extrañé el hecho de que el OP quiere un color diferente para diferentes tipos de archivos.
enzotib
Guau. Demasiado trabajo para que valga la pena para mí
Kolob Canyon
6

Podrías -exechacer la mayor parte de eso (mi solución no colorea la parte del directorio de manera diferente). Si tiene -printsu findcomando, reemplácelo por -exec ls --color -d; Si está utilizando la impresión implícita, agréguela. Esto supone que su lssoporte es la --coloropción.

find . -exec ls --color -d {} \;
Tim Kennedy
fuente
1
No estoy seguro de quién votó esto, pero no creo que hayan terminado de leer la pregunta (aunque no digo que esta respuesta merezca un voto negativo correspondiente) ...
Ignacio Vázquez-Abrams
4

Esto hace solo el resaltado de dos colores para la ruta y el nombre de archivo, no la cosa por tipo de archivo de ls:

Configure los colores de grepsalida de la manera correcta para partes coincidentes y no coincidentes, y haga coincidir el nombre del archivo:

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


pantalla de color grep

Es posible que no desee sobrescribir la variable GREP_COLORS, así que configúrela solo para grep:

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

(Las definiciones de la variable obsoleta GREP_COLORtienen menos prioridad que las de GREP_COLORS)

Para los códigos de color, consulte colortest-16desde el paquete colortest,
y la sección "Conjunto de gráficos Rendition" de secuencias de comandos de terminal ANSI .

Volker Siegel
fuente
-1

Me gustó la idea -exec. Lo usé para crear esta función:

function ff {
    find . -name $1 -exec ls -G -d {} \;
}
IBootstrap
fuente
Esto no parece producir color ...?
Leo Ufimtsev