我有这个命令,效果很好
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.txt
,myfile.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
)
例子:
-
highlight <<EOF dir/dir/file dir/dir/ dir/dir///// no-slash / . EOF
-
find . | highlight
-
grep -lr . | highlight
笔记:
过滤器可以从以下位置获取输入
find
,grep
或任何事物. 该过滤器不依赖于非可移植的find -printf
。tput bold
但这些都不是可移植的。请start=
根据end=
您的需要进行调整。sed
代码中|
用作 的分隔符s
。 重要的是不要使用或|
的扩展。 根据您的需要进行调整。 请记住几乎可以使用任何字符作为分隔符。$start
$end
s
sed
过滤器会测试其标准输出是否为终端。如果不是,则变为
cat
(即无操作过滤器)。您可以使用 强制突出显示非终端highlight -f
。示例:find . | highlight -f | head -n 3