彩色 FIND 输出?

彩色 FIND 输出?

是否有可能获得彩色输出寻找命令?也就是说,在每个找到的项目的路径中,目录是蓝色的,可执行脚本是绿色的,等等?我使用的是 4.4.2 版本GNU findutils

编辑 - 为了澄清,每个结果都会像这样突出显示:

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

(例如,如果执行find . -type f)。

答案1

更新:我添加了一个新的(不同的)脚本......Ignacio Vazquez-Abrams 有一点:这个问题确实要求executable scripts are green, et cetera......好吧......你会在这个答案的末尾找到这样一个(原型)脚本。


第一个(原始)部分是关于grc和 的grcat

这应该可行;grc......(如恩佐替布已经指出..包名称是grc...示例中使用的子实用程序是grcat

generic colouriser for everything

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

以下示例打印

  • ./洋红色
  • bin/cpp/青色
  • bigint粗体白色

我还没有完全弄清楚它如何处理它的配置文件,但这看起来它会做你想做的事(一旦你驯服它)..例如。对于没有子目录的文件,颜色序列似乎与表达式的序列不同。
我认为这是可能的(但我现在有点忙)......

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

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

这是新的伊格纳西奥的启发脚本 :)

如果您使用单个路径作为 的第一个参数,则此方法有效find
未经测试这个脚本中的问题。这只是概念。
一个问题是:符号链接...浑水...
按原样,ERROR当遇到未知类型(例如符号链接)时,它会打印 an ,然后继续处理该类型。
感谢您enzotib提供的tput示例。

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 

答案2

您可以用来-exec完成大部分工作(我的解决方案不会以不同的方式对目录部分进行着色)。如果-print您的命令中有find,请将其替换为-exec ls --color -d;如果您使用隐式打印,请添加它。这假设您ls支持该--color选项。

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

答案3

这仅对路径和文件名进行双色突出显示,而不对每个文件类型进行突出显示 ls:

grep以正确的方式配置匹配和不匹配部分的输出颜色,并匹配文件名:

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


屏幕 grep 彩色

您可能不想覆盖该变量GREP_COLORS,因此仅将其设置为grep

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

(来自已弃用变量的定义的GREP_COLOR优先级低于 中的定义GREP_COLORS

对于颜色代码,请参见包装colortest-16中 的“设置图形呈现”部分colortest
ANSI 终端命令序列

答案4

延伸至彼得·O.的回答:

您可以将此函数定义添加到您的.bashrc.bash_aliases.

lr代表列表递归,但你可以随意命名)

lr () { 
   dircol=$(tput bold ;tput setaf 4)
   coloff=$(tput sgr0)


   case $# in
    2)
     root=$2
     depth=$1
     ;;
    1)
     root="."
     depth=$1
     ;;
    0)
     root="."
     depth=2
     ;;   
    *)
     echo "Specify only upto 2 arguments: [depth [root folder]]"
     return
     ;;
   esac

   root="${root%/}/"  # add trailing '/'
   
   find "$root" -maxdepth "$depth" -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
            ;; 
        # l\ *) printf "This is link.\n";;
        l\ *) l="$root${line:2}"
            d="${l%/*}/"
            f="${l##*/}"            
            cd -P "$d" 
            printf "%s" "$dircol$d$coloff"  
            ls --color=always -d1 "$f" | tr -d '\n' 
            printf " -> "
            readlink -f "$f"
            cd - >/dev/null
            ;; 
           *) printf "ERROR - type not yet catered for\n";;  
       esac
    done
}

首先解析 thelocation--maxdepththe findwill work,然后列出它的颜色。

它使用以下形式的参数[depth [root folder]]

使用示例:

lr 
lr 5
lr 2 Documents

相关内容