Saída FIND colorida?

13

É possível obter saída colorida do comando find ? Ou seja, no caminho de cada item encontrado, os diretórios são azuis, os scripts executáveis ​​são verdes, etc. Estou usando a versão 4.4.2 do GNU findutils .

Editar - Para esclarecer, cada resultado seria destacado da seguinte forma:

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

(se, por exemplo, executando find . -type f).

nós
fonte
Eu escrevi um substituto-principalmente-achado compatível chamado bfsque tem essa funcionalidade: github.com/tavianator/bfs
Tavian Barnes

Respostas:

9

UPDATE: adicionei um novo script (diferente) ...Ignacio Vazquez-Abrams tinha um ponto: a pergunta realmente pede executable scripts are green, et cetera... ok ... você encontrará um script (protótipo) no final desta resposta.


Esta primeira seção (original) é sobre grc e grcat.

Isso deve funcionar; grc... (como o enzotib indicou .. O nome do pacote é grc... O sub-utilitário usado no exemplo égrcat

generic colouriser for everything

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

O exemplo a seguir imprime

  • ./ em magenta
  • bin/cpp/ em ciano
  • bigint em branco arrojado

Ainda não resolvi completamente como ele lida com o arquivo de configuração, mas parece que ele fará o que você deseja (depois de domá-lo) .. por exemplo. para um arquivo sem subdiretório e a sequência de cores parece não estar na mesma sequência que as expressões.
Presumo que seja possível (mas estou um pouco ocupado no momento) ...

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

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

Aqui está o novo script inspirado em Ignacio :)

Isso funciona se você usar um único caminho como o primeiro argumento para find.
Existem problemas não previstos neste script. É apenas conceito.
Uma questão é: Links simbólicos ... águas turvas ...
No estado atual , ele imprime um ERRORquando encontra um tipo desconhecido (por exemplo, um link simbólico) e, em seguida, continua o processamento além disso.
Obrigado enzotibpelos tputexemplos.

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
fonte
Você esqueceu de dizer que está se referindo ao grcatutilitário do grcpacote :) No começo, tive algumas dificuldades para entender o que você estava dizendo.
enzotib
Eu realmente senti falta do fato de o OP querer uma cor diferente para diferentes tipos de arquivos.
enzotib
Uau. Trabalho demais para valer a pena para mim #
Kolob Canyon 22/09
6

Você poderia usar -execpara fazer a maior parte disso (minha solução não colore a parte do diretório de maneira diferente). Se você tem o -printseu findcomando, substitua-o por -exec ls --color -d; se você estiver usando a impressão implícita, adicione isso. Isso pressupõe que seu lssuporte seja a --coloropção.

find . -exec ls --color -d {} \;
Tim Kennedy
fonte
1
Eu não tenho certeza de quem upvoted isso, mas eu não acredito que eles terminar de ler a pergunta (não que eu estou dizendo que esta resposta merece uma downvote correspondente embora) ...
Ignacio Vazquez-Abrams
4

Isso faz apenas o realce de duas cores para o caminho e o nome do arquivo, e não o tipo de arquivo por tipo de ls:

Configure as cores da grepsaída da maneira correta para as peças correspondentes e não correspondentes e corresponda ao nome do arquivo:

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


tela-grep-colorido

Você pode não querer substituir a variável GREP_COLORS, portanto, defina-a apenas para grep:

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

(As definições da variável reprovada GREP_COLORtêm menos prioridade do que as contidas GREP_COLORS)

Para os códigos de cores, consulte colortest-16a partir do pacote colortest,
e seção "Set Gráficos Rendition" em sequências de comandos de terminal ANSI .

Volker Siegel
fonte
-1

Gostei da ideia -exec. Eu usei para criar esta função:

function ff {
    find . -name $1 -exec ls -G -d {} \;
}
IBootstrap
fonte
Isso não parece produzir cores ..?
Leo Ufimtsev