Farbige FIND-Ausgabe?

13

Ist es möglich, mit dem Befehl find eine farbige Ausgabe zu erhalten ? Das heißt, im Pfad jedes gefundenen Elements sind Verzeichnisse blau, ausführbare Skripte grün und so weiter? Ich verwende Version 4.4.2 von GNU Findutils .

Bearbeiten - Zur Verdeutlichung wird jedes Ergebnis folgendermaßen hervorgehoben:

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

(wenn zum Beispiel ausgeführt wird find . -type f).

wir s
quelle
Ich habe einen größtenteils find-kompatiblen Ersatz geschrieben bfs, der diese Funktionalität hat: github.com/tavianator/bfs
Tavian Barnes

Antworten:

9

UPDATE: Ich habe ein neues (anderes) Skript hinzugefügt ... Ignacio Vazquez-Abrams hatte einen Punkt: Die Frage fragt wirklich nach executable scripts are green, et cetera... okay ... ein solches (Prototyp-) Skript finden Sie am Ende dieser Antwort.


Dieser erste (originale) Abschnitt handelt von grcund grcat.

Das sollte funktionieren; grc... (wie Enzotib herausgestellt hat. Der Paketname ist grc... Das im Beispiel verwendete Unterprogramm istgrcat

generic colouriser for everything

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

Das folgende Beispiel wird gedruckt

  • ./ in Magenta
  • bin/cpp/ in cyan
  • bigint in fettweiß

Ich habe noch nicht vollständig geklärt, wie es mit der Konfigurationsdatei umgeht, aber so sieht es aus, als würde es das tun, was Sie wollen (sobald Sie es gezähmt haben). für eine Datei ohne Unterverzeichnis, und die Farbsequenz scheint nicht in der gleichen Reihenfolge wie die Ausdrücke zu sein.
Ich nehme an, es ist möglich (aber ich bin im Moment ein bisschen beschäftigt) ...

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

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

Hier ist das neue, von Ignacio inspirierte Drehbuch :)

Dies funktioniert, wenn Sie einen einzelnen Pfad als erstes Argument für verwenden find.
Es gibt UNGEPRÜFTE Probleme in diesem Skript. Es ist nur ein Konzept.
Ein Problem ist: Symbolische Verknüpfungen ... trübe Gewässer ...
Wie sie sind, gibt sie eine aus, ERRORwenn sie auf einen unbekannten Typ stößt (z. B. eine symbolische Verknüpfung), und setzt die Verarbeitung danach fort.
Vielen Dank enzotibfür die tputBeispiele.

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
quelle
Sie haben vergessen zu sagen, dass Sie sich auf das grcatDienstprogramm aus dem grcPaket beziehen :) Am Anfang hatte ich einige Schwierigkeiten zu verstehen, was Sie sagen.
Enzotib
Ich habe wirklich die Tatsache vermisst, dass das OP eine andere Farbe für verschiedene Arten von Dateien haben möchte.
Enzotib
Beeindruckend. Zu viel Arbeit, um es für mich wert zu sein
Kolob Canyon
6

Sie könnten -execdas meiste davon erledigen (meine Lösung färbt den Verzeichnis-Teil nicht anders). Wenn Sie -printin Ihrem findBefehl haben, ersetzen Sie ihn durch -exec ls --color -d; Wenn Sie das implizite Drucken verwenden, fügen Sie dies hinzu. Dies setzt voraus, dass Sie lsdie --colorOption unterstützen .

find . -exec ls --color -d {} \;
Tim Kennedy
quelle
1
Ich bin mir nicht sicher, wer das befürwortet hat, aber ich glaube nicht, dass sie die Frage zu Ende gelesen haben (nicht, dass ich sage, dass diese Antwort eine entsprechende Ablehnung verdient) ...
Ignacio Vazquez-Abrams
4

Dies gilt nur die zweifarbige Highlight für Pfad und Dateinamen, nicht die pro-Datei des Typs Sache von ls:

Konfigurieren Sie die Farben der grepAusgabe auf die richtige Weise für übereinstimmende und nicht übereinstimmende Teile und passen Sie den Dateinamen an:

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


Bildschirm-grep-farbig

Möglicherweise möchten Sie die Variable nicht überschreiben. Legen Sie GREP_COLORSsie daher nur für Folgendes fest grep:

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

(Definitionen der veralteten Variablen GREP_COLORhaben eine geringere Priorität als diejenigen in GREP_COLORS)

Für die Farbcodes finden Sie colortest-16aus dem Paket colortest,
und Abschnitt „Set Graphics Rendition“ in ANSI - Terminal - Befehlssequenzen .

Volker Siegel
quelle
-1

Mir hat die -exec Idee gefallen. Ich habe es benutzt, um diese Funktion zu erstellen:

function ff {
    find . -name $1 -exec ls -G -d {} \;
}
IBootstrap
quelle
Dies scheint keine Farbe zu produzieren ..?
Leo Ufimtsev