Output FIND berwarna?

13

Apakah mungkin untuk mendapatkan output berwarna dari perintah find ? Artinya, di jalur setiap item yang ditemukan, direktori berwarna biru, skrip yang dapat dieksekusi berwarna hijau, dan lain-lain? Saya menggunakan findutils GNU versi 4.4.2 .

Sunting - Untuk memperjelas, setiap hasil akan disorot seperti ini:

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

(jika, misalnya, mengeksekusi find . -type f).

kami
sumber
Saya menulis pengganti bfsyang sebagian besar dapat ditemukan yang disebut memiliki fungsi ini: github.com/tavianator/bfs
Tavian Barnes

Jawaban:

9

UPDATE: Saya telah menambahkan skrip (berbeda) baru ... Ignacio Vazquez-Abrams ada benarnya: Pertanyaannya benar-benar meminta executable scripts are green, et cetera.. oke ... Anda akan menemukan skrip (prototipe) pada akhir jawaban ini.


Bagian pertama (asli) ini adalah tentang grcdan grcat.

Ini seharusnya bekerja; grc... (seperti yang ditunjukkan enzotib .. Nama paketnya adalah grc... Sub-utilitas yang digunakan dalam contoh, adalahgrcat

generic colouriser for everything

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

Contoh berikut dicetak

  • ./ dalam magenta
  • bin/cpp/ di cyan
  • bigint dalam warna putih tebal

Saya belum sepenuhnya memilah bagaimana menangani file konfigurasi, tetapi ini sepertinya akan melakukan apa yang Anda inginkan (setelah Anda menjinakkannya) .. mis. untuk file tanpa sub-dir, dan urutan warna tampaknya tidak berada dalam urutan yang sama dengan ekspresi.
Saya menganggap itu mungkin (tapi saya agak sibuk saat ini) ...

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

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

Ini skrip baru yang terinspirasi dari Ignacio :)

Ini berfungsi jika Anda menggunakan jalur tunggal sebagai argumen pertama find.
Ada masalah yang TIDAK TERUJI dalam skrip ini. Itu hanya konsep.
Salah satu masalah adalah: Tautan Simbolik ... perairan keruh ...
Seperti apa adanya, ia mencetak sebuah ERRORketika bertemu dengan jenis yang tidak dikenal (mis. Tautan simbolis), dan kemudian melanjutkan pemrosesan melewati itu.
Terima kasih enzotibatas tputcontohnya.

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
sumber
Anda lupa mengatakan Anda merujuk ke grcatutilitas dari grcpaket :) Pada awalnya saya memiliki beberapa kesulitan untuk memahami apa yang Anda katakan.
enzotib
Saya sangat merindukan fakta bahwa OP menginginkan warna yang berbeda untuk berbagai jenis file.
enzotib
Wow. Terlalu banyak pekerjaan yang layak untuk saya
Kolob Canyon
6

Anda dapat menggunakannya -execuntuk melakukan sebagian besar dari itu (solusi saya tidak mewarnai bagian direktori secara berbeda). Jika Anda memiliki -printdi Anda findperintah, menggantinya dengan -exec ls --color -d; jika Anda menggunakan pencetakan implisit, tambahkan itu. Ini mengasumsikan Anda lsmendukung --coloropsi.

find . -exec ls --color -d {} \;
Tim Kennedy
sumber
1
Saya tidak yakin siapa yang mengangkat ini, tetapi saya tidak percaya mereka selesai membaca pertanyaan (bukan berarti saya mengatakan jawaban ini pantas menerima downvote yang sesuai) ...
Ignacio Vazquez-Abrams
4

Ini hanya menyoroti dua warna untuk path dan nama file, bukan hal per-filetype ls :

Konfigurasikan warna grepoutput dengan cara yang benar untuk bagian yang cocok dan tidak cocok, dan cocok dengan nama file:

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


layar-grep berwarna

Anda mungkin tidak ingin menimpa variabel GREP_COLORS, jadi atur hanya untuk grep:

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

(Definisi dari variabel yang ditinggalkan GREP_COLORmemiliki prioritas kurang dari yang ada di GREP_COLORS)

Untuk kode warna, lihat colortest-16dari paket colortest,
dan bagian "Set Rendition Graphics" dalam urutan perintah terminal ANSI .

Volker Siegel
sumber
-1

Saya menyukai ide -exec. Saya menggunakannya untuk membuat fungsi ini:

function ff {
    find . -name $1 -exec ls -G -d {} \;
}
IBootstrap
sumber
Ini sepertinya tidak menghasilkan warna ..?
Leo Ufimtsev