可替代 find 与 grep 的三个高效搜索命令

可替代 find 与 grep 的三个高效搜索命令

本文将介绍三个高效搜索命令,分别是 fd、ripgrep 与 fzf。今天这几个命令是我强烈推荐,毕竟,那种等待 find 和 grep 搜索结果真的让人痛苦。

我将介绍的 fd 和 ripgreap 对标的是传统 grep 和 find,它们在性能和使用体验上都有大幅提升。如果你成为 10x 程序员,强烈推荐使用它们。

fd[1] ,目录与文件搜索命令,比默认 find 更易于使用,而且查找速度上更快;

ripgrep[2] ,可用于高效的内容搜索,比默认的 grep 命令速度更快;

fzf[3] ,命令行交互式模糊搜索工具,可与其他命令进行结合,提高使用体验;

如上的 fd 与 ripgrep 是由 rust 编写,性能上完胜传统的 find 与 grep,而 fzf 是由 Go 实现的。

感谢关注我的公众号:

fd[4]

fd 是一款文件查找命令,可替换系统默认 find,它的体验更友好,且查询效率极高。我们在使用传统的 find 时,要经常查手册看帮助文档,但使用 fd,它的默认行为就能满足我们大部分的需求。

如何使用呢?

安装

brew install fd

递归

文件系统下搜索文件名,最常见的场景是递归搜索文件名包含 pattern 的文件,不知道你是否能立刻想起来 find 如何写呢?

示例:遍历查找。

$ fd pattern
可替代 find 与 grep 的三个高效搜索命令

正则

如果要正则查询,pattern 默认即支持正则表达式。

查找文件名包含日期的文件:

可替代 find 与 grep 的三个高效搜索命令

或者查找所有的 go 代码文件。

可替代 find 与 grep 的三个高效搜索命令

这个表达式更加正确的表述是 fd .*.go$,查出所有以 .go 结尾的文件。

通配符

fd 同样是支持通配符的,通过 -g 选项指定通配符。

可替代 find 与 grep 的三个高效搜索命令

文件类型

前面的查找 go 文件,其实也是查找 Go 源码文件类型。但正则和通配符,都比较繁琐,可直接通过 fd -e go pattern 的模式直接寻找指定扩展的文件。

示例:查找 python 源码文件。

可替代 find 与 grep 的三个高效搜索命令

如果无需 patern,则表示查找所有的 .py 的文件。

可替代 find 与 grep 的三个高效搜索命令

隐藏文件和 .gitinogre

fd 搜索效率高的一个原因是它默认不查找隐藏文件和 gitignore 文件。

如想启用隐藏文件的查找,可指定 -H 选项,示例如下:

可替代 find 与 grep 的三个高效搜索命令

从上图可知,其中包含了隐藏目录 .git 下的文件。

除了默认忽略 hidden 文件,fd 还会忽略 .gitignore 中的文件,选项 -I 即可查找包含在 .gitinogre/.fdignore/.ignore 的文件。

$ fd -I pattern

其他示例

fd 的更多选项,我就不一一介绍了,可以查看如下表格。

案例 命令 说明
忽略大小写 fd -i readme.md 包含 readme.md 和 README.md
大小写的 smartcase 模式 fd -s readme.md 包含 readme.md 和 README.md
fd -s README.md 只包含 README.md
查找结果显示详细信息 fd -l .go 查询结果显示文件详情
大小过滤 fd -S +1000k 查询大小 > 1000k 的文件
仅查找目录 fd –type/-t directory golang 查询所有目录文件
查询并执行命令 fd –type/-t file -x wc -l 查询文件并计算行数
fd –type/-t file -X vim 查询所有文件并用 vim 打开

性能

除了忽略隐藏和 gitignore 中的文件外,fd 在性能上也是碾压 find。通过 hyperfine 命令测试 fd 与 find。

hyperfine --warmup 3 "find . -iname *.go" "fd -i -g '*.go' -uu"

性能对比结果:

可替代 find 与 grep 的三个高效搜索命令

我们的压测显示,fd 相较于 find 快了 3.88 倍。

ripgrep[5]

ripgrep 是一款文本搜索命令,功能与 grep 类似。和 fd 之于 find 一样,ripgrep 在体验和性能上同样完胜 grep。

安装

brew install ripgrep

递归

ripgrep 的默认行为也是递归搜索,命令为 rg pattern,且默认高亮显示,与 grep --color main . -nR 对比,明显更加简洁易用,体验更好。

示例效果:

可替代 find 与 grep 的三个高效搜索命令

指定目录

ripgrep 最后的参数即可指定搜索的目录。

rg main ~/Code/golang-examples/
可替代 find 与 grep 的三个高效搜索命令

指定文件

搜索指定文件与指定目录类似,命令的最后一个参数指定即可。

rg main ~/Code/golang-examples/main.go
可替代 find 与 grep 的三个高效搜索命令

通配符

我们使用 -g 通过通配符指定搜索路径。

如下是禁用目录递归:

rg main -g '!/*/*'

还可实现如排除指定的文件:

rg main -g '!main.go'

或者排除指定的目录

rg -g '!directory'

正则

ripgrep 支持通过 -e 选项启用正则表达式搜索,如搜索文件中的指定日期格式内容。

rg -e '[0-9]{2}:[0-9]{2}'

默认过滤

和 fd 一样,ripgrep 的高效率搜索能力一方面也是因为默认忽略了一些文件,如它忽略隐藏文件以及 .gitgnore .ignore .rgignore 中的文件。禁用 ignore 可通过选项 –no-ignore 即可。

对于隐藏文件,通过 --hidden 即可搜索包含隐藏文件。

如果希望彻底禁用隐藏能力,通过 -uuu 实现,如 rg -uuu pattern

大小写敏感

ripgrep 默认即大小写敏感。

rg pattern

通过 -i 选项可忽略大小写。

rg -i pattern

或者通过 -S 启用 smartcase 模式,即

rg -S pattern

搜索并替换

ripgrep 中,我们通过 -r 可直接替换搜索结果,但不改变原内容。

rg main ~/Code/golang-examples r main # 只替换输出,未修改文件
可替代 find 与 grep 的三个高效搜索命令

配置

ripgrep 支持配置文件修改 ripgrep 的默认行为。我们通过设置环境变量 RIPGREP_CONFIG_PATH 指定配置文件路径。

配置文件的配置方式和上文介绍的 bat 类似,都是通过 --xxx 选项的形式设置。

# Don't let ripgrep vomit really long lines to my terminal, and show a preview.
--max-columns=150
--max-columns-preview

# Add my 'web' type.
--type-add
web:*.{html,css,js}*

# Search hidden files / directories (e.g. dotfiles) by default
--hidden

# Using glob patterns to include/exclude files or folders
--glob=!.git/*

# or
--glob
!.git/*

# Set the colors.
--colors=line:none
--colors=line:style:bold

# Because who cares about case!?
--smart-case

如我们希望 ripgrep 默认启用 smartcase 能力,可将 --smart-case 直接配置到配置文件中。

fzf[6]

fzf 全名 fuzzy finder,一款通用的命令行模糊查找工具。它可与其他命令结合,提升其他命令的使用体验。

安装

brew install fzf

目录搜索

fzf 的默认行为是在当前目录搜索。当然它的搜索和 fd 的搜索不同,它会进入交互式模式搜索文件或目录路径。

可替代 find 与 grep 的三个高效搜索命令

它支持通过 CTRL+P/N 上下选择,确认搜索结果后,输入 Enter 确认后,它会将输出直接作为输出打印到标准输出。由于它输出为标准输出,我们就有了更多可能性,通过管道将它与其他命令结合。

命令组合

fzf 最大的魅力在于,我们可将其与其他命令组合,如

  • • 将其他命令的输出作为 fzf 的输入,基于它进行搜索;

  • • 或将 fzf 的搜索内容作为其他命令的输入,更智能使用其他命令。

我们具体介绍下吧。

首先,我们示例将 onetwothreefour 作为输入,通过 fzf 搜索选择。

echo "onentwonthreenfour" | fzf
可替代 find 与 grep 的三个高效搜索命令

更多可能就诞生了,我们可以讲 ls 的输出作为 fzf 的输入。

ls | fzf
可替代 find 与 grep 的三个高效搜索命令

将 fd 查找结果作为 fzf 的输入。

fd --type file | fzf
可替代 find 与 grep 的三个高效搜索命令

接下来,我们尝试将搜索结果作为其他命令的输入。毕竟,如果 fzf 的搜索结果只是输出到终端,那就太可惜了,可将其作为其它命令的输入。

如将 fzf 搜索结果作为 vim 的输入,助力 vim 快速打开文件。

vim `fzf`
可替代 find 与 grep 的三个高效搜索命令

我们也可以将多个命令组合,fzf 从其他命令接收输入,同时将搜索结果输出给其他啊命令。这样就能实现更多可能。

是不是已经发现,fzf 实现更多可能性的能力,如 command1 | fzf | xargs command2,将 command1 的结果作为 fzf 的搜索来源,将 fzf 的确认结果作为 command2 的输入。

如上文中的 zoxide (高效 cdi 命令)快速进入文件能力,我们可用 fzf 实现:

cd `zoxide query --list {querystring} | fzf`
可替代 find 与 grep 的三个高效搜索命令

默认的 zoxide query --list 只记录的是 zoxide 中的历史记录,如想实现进入任意的目录,可使用如下命令:

cd `fd --type=directory | fzf`
可替代 find 与 grep 的三个高效搜索命令

如下是一个 cdg 命令,作用是交互式搜索全局任意目录并通过 cd 进入。可 zoxide 中的 cdi 对比。

alias cdg='cd_global() {cd $(fd --type directory $1 $2 | fzf)}; cd_global'

使用方式形如 cdg pattern directory,在哪一个目录下查询包含 pattern 的目录,确认后即可 cd 进入到这个目录。

可替代 find 与 grep 的三个高效搜索命令

总结

本文介绍了三个实现终端高效搜索的命令,分别是用于文件查找的 fd、文本搜索的 ripgrep 及交互式搜索工具 fzf。希望通过将这几个命令的组合使用,再进一步提升我们的终端使用效率。

最后,感谢阅读,希望本文对你有所帮助。

引用链接

[1] fd: https://github.com/sharkdp/fd
[2] ripgrep: https://github.com/BurntSushi/ripgrep
[3] fzf: https://github.com/junegunn/fzf
[4] fd: https://github.com/sharkdp/fd
[5] ripgrep: https://github.com/BurntSushi/ripgrep
[6] fzf: https://github.com/junegunn/fzf


原文始发于微信公众号(码途漫漫):可替代 find 与 grep 的三个高效搜索命令

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/270657.html

(0)
土豆大侠的头像土豆大侠

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!