在“查找”命令中突出显示文件名

在“查找”命令中突出显示文件名

我有这个命令,效果很好

find . -type f -name *.txt -exec grep -li blah {} \;

假设输出为:

/tmp/folder1/file1.txt
/tmp/folder2/myfile.txt
/tmp/thisfile.txt

如果我这么做:

find . -type f -name *.txt -exec grep -li -E --color blah {} \;

这将突出显示整个字符串。因此/tmp/folder1/file1.txt将被突出显示。

我可以让它只突出显示文件名吗?这样file1.txtmyfile.txt、 、thisfile.txt将被突出显示,而不会突出显示其他内容。

这可能吗?

答案1

$ find --version
find (GNU findutils) 4.7.0

因此,find 不执行\x1b\e,那么让我们来帮忙......

$ find -type f -maxdepth 2 -printf "%h/§[1m%f§[m\n" | sed -re 's/§/\x1b/g' 

您将在其中man find找到更多此类%<character>东西。
它们定义了您想要打印的内容。

这里%h打印路径的第一部分和%f最后一部分(通常是文件名)...

著名的:

$ find -type f -maxdepth 2 -printf "%h/$(tput bold)%f$(tput sgr0)\n"

...这更好,因为它与终端类型无关(只要 tput,ncurses-bin已安装);原样:

$ find -type f -maxdepth 2 \  
-printf "%h/$(setterm --reverse on)%f$(setterm --reverse off)\n"

参考:man termifo用于“粗体”和类似内容,甚至man setterm(来自 util-linux)作为tput

答案2

这是一个通用过滤器,可突出显示从/行末到行末的文本。如果没有,/则将突出显示整行。尾随/字符被视为非/

highlight() (
if [ -t 1 ] || [ "$1" = -f ]; then
   start="$(tput bold)"
   end="$(tput sgr0)"
   sed "s|[^/]*./*$|$start\\0$end|;t;s|.*|$start\\0$end|;"
else
   cat
fi
)

例子:

  1. highlight <<EOF
    dir/dir/file
    dir/dir/
    dir/dir/////
    no-slash
    /
    .
    EOF
    
  2. find . | highlight
    
  3. grep -lr . | highlight
    

笔记:

  • 过滤器可以从以下位置获取输入findgrep任何事物. 该过滤器不依赖于非可移植的find -printf

  • tput bold但这些都不是可移植的。请start=根据end=您的需要进行调整。

  • sed代码中|用作 的分隔符s。 重要的是不要使用或|的扩展。 根据您的需要进行调整。 请记住几乎可以使用任何字符作为分隔符。$start$endssed

  • 过滤器会测试其标准输出是否为终端。如果不是,则变为cat(即无操作过滤器)。您可以使用 强制突出显示非终端highlight -f。示例:

    find . | highlight -f | head -n 3
    

相关内容