本文将介绍一些用于高效查找和查找的指令,它们分别是 fd、ripgrep 与 fzf。相对于常用的 grep 和 find,这些指令在功能有大部分进步,并且,它们的运用方法上更契合人道。

如下是这几个指令的简略阐明:

  • fd,目录与文件查找指令,比默许 find 更易于运用,并且查找速度上更快;
  • ripgrep,用于高效的内查找容;
  • fzf,是一款指令行交互式的含糊查找东西,可与其他指令进行结合,进步运用体会;

其间的 fd 与 ripgrep 是用 rust 编写,功能上完虐传统的 find 与 grep。

系列阅览:

更多待续…

fd

fd 是一款文件查找的指令,可用于替换默许的 find,它在体会上愈加友爱,且查询功率极高。

装置

brew install fd

运用

事例一 简略查找 – fd pattern

我的终端环境:高效 shell 指令(二)之文件查找与内容查找 - fd ripgrep fzf

事例二 正则查询 – fd regex_exp

如查找包括文件名中包括日期的文件:

我的终端环境:高效 shell 指令(二)之文件查找与内容查找 - fd ripgrep fzf

或许查找一切的 go 代码文件。

我的终端环境:高效 shell 指令(二)之文件查找与内容查找 - fd ripgrep fzf

这个表达式愈加正确的表述是 fd .*.go$,超出一切以 .go 结尾的文件。

事例三 通配符

我的终端环境:高效 shell 指令(二)之文件查找与内容查找 - fd ripgrep fzf

事例四 指定类型

前面的查找 go 文件的方法,无论是经过正则仍是通配符,都相对繁琐一点,可直接经过 fd -e go pattern 的方法直接寻找指定扩展的文件。

如下示例查找以 .py 为扩展且文件名包括 moving_average 的文件:

我的终端环境:高效 shell 指令(二)之文件查找与内容查找 - fd ripgrep fzf

假如无 patern,作用则是查找一切的 .py 的文件,如下所示:

我的终端环境:高效 shell 指令(二)之文件查找与内容查找 - fd ripgrep fzf

事例五 躲藏文件和 .gitinogre

默许情况下,fd 的查找成果不包括躲藏文件,可经过 -H 选项启用:

我的终端环境:高效 shell 指令(二)之文件查找与内容查找 - fd ripgrep fzf

从上图能够看出,其间包括了不少 .git/config 文件,而 .git 是躲藏文件。

查询规模包括 gitignore

相同,除了默许疏忽 hidden 文件,fd 还会疏忽 .gitignore 中的文件,选项 -I 即可查找包括在 .gitinogre/.fdignore/.ignore 的文件,形如 fd -I pattern

其他示例

事例 指令 阐明
疏忽巨细写 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 打开

功能

经过 hyperfine 或 time 指令测验,与 find 进行功能比照,包括一切文件且巨细写不灵敏查找。

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

我的终端环境:高效 shell 指令(二)之文件查找与内容查找 - fd ripgrep fzf

ripgrep

ripgrep 是一款文本查找指令,功能与 grep 相似;

装置

brew install ripgrep

运用:

用法一 默许递归查找当时目录,如 rg pattern;

默许高亮显现,比照于 grep --color main . -nR 简洁易用,体会更好。作用如下:

我的终端环境:高效 shell 指令(二)之文件查找与内容查找 - fd ripgrep fzf

用法二 查找指定目录,rg patern directory

rg main ~/Code/golang-examples/

我的终端环境:高效 shell 指令(二)之文件查找与内容查找 - fd ripgrep fzf

用法三 查找指定文件,rg pattern filepath

rg main ~/Code/golang-examples/main.go

我的终端环境:高效 shell 指令(二)之文件查找与内容查找 - fd ripgrep fzf

用法四 通配符禁用目录

经过通配符方法,禁用目录递归。

rg main -g '!/*/*'

其他还可完成如扫除文件:

rg main -g '!main.go'

扫除文件

rg -g '!directory'

用法五 正则查找

经过 -e 选项启用正则表达式查找,如:

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

用法六 默许过滤

和 fd 一样,ripgrep 的高功率查找才能一方面也是由于默许疏忽了一些文件,如它疏忽躲藏文件以及 .gitgnore .ignore .rgignore 中的文件。禁用 ignore 可经过选项 –no-ignore 金融即可。而对于躲藏文件,经过 --hidden 即可查找包括躲藏文件。

假如期望禁用一切躲藏文件,则可经过 -uuu 完成,如 rg -uuu pattern

用法八 巨细写灵敏:

默许巨细写灵敏:rg pattern,可经过 -i 选项疏忽巨细写:rg -i pattern,或许经过 -S 启用 smartcase 方法,即 rg -S pattern

用法九 查找并替换

经过 -r 可直接替换查找成果,但不改变原内容。

rg main ~/Code/golang-examples r main # 只替换输出,未修正文件

我的终端环境:高效 shell 指令(二)之文件查找与内容查找 - fd ripgrep fzf

装备

装备文件修正 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

fzf 全名 fuzzy finder,是一款通用的指令行含糊查找东西。它可与其他指令结合,进步其他指令的运用体会。

装置

brew install fzf

运用

用法一 目录查找

默许在当时所在目录进入交互式目录文件查找途径,作用如下所示:

我的终端环境:高效 shell 指令(二)之文件查找与内容查找 - fd ripgrep fzf

支持经过 CTRL P/N 上下挑选,承认查找成果后,输入 Enter 承认后,它会将输出直接作为输出打印到规范输出。

用法二 将其他指令输出作为 fzf 的查找内容;

除了默许根据当时方位查找文件目录,fzf 的查找内容可自定义。如将 onetwothreefour 作为输入,经过 fzf 查找挑选。

echo "onentwonthreenfour" | fzf

我的终端环境:高效 shell 指令(二)之文件查找与内容查找 - fd ripgrep fzf

如此一来,更过或许就诞生了,如 ls 的文件作为输入:

ls | fzf

我的终端环境:高效 shell 指令(二)之文件查找与内容查找 - fd ripgrep fzf

将上面介绍的 fd 的查找成果作为输入:

fd --type file | fzf

用法三 将查找成果作为其他指令的输入;

fzf 的查找成果假如只是打印到终端,那就太可惜了,可将其其它指令的输入。如下指令:

vim `fzf`

我的终端环境:高效 shell 指令(二)之文件查找与内容查找 - fd ripgrep fzf

将 fzf 的查找成果作为 vim 指令的输入。

用法四 输入输出,指令组合完成更多或许

试验到这里,是不是现已发现,fzf 完成更多或许性的才能,形如 command1 | fzf | xargs command2,将 command1 的成果作为 fzf 的查找来历,将 fzf 的承认成果作为 command2 的输入。

如上节的 zoxide 快速进入文件才能。

    cd `zoxide query --list {querystring} | fzf`

我的终端环境:高效 shell 指令(二)之文件查找与内容查找 - fd ripgrep fzf

默许的 zoxide query --list 只记载的是 zoxide 中的历史记载,如想完成大局查询,可替换为相似如下指令:

cd `fd --type=directory | fzf`

我的终端环境:高效 shell 指令(二)之文件查找与内容查找 - fd ripgrep fzf

如下是一个 cdg 的指令完成,可完成 cd 指令的任意目录的快速交互式查找:

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

运用方法形如 cdg pattern directory,在哪一个目录下查询包括 pattern 的目录,承认后即可 cd 进入到这个目录。

阐明下,我实际运用下来,这个指令的确很少需要,由于大多数时间我仍是在访问我常常运用的目录,默许 zoxide 的才能完全满足运用。

总结

本文介绍了三个与查找查找相关的指令,分别是用于文件查找的 fd、文本查找的 ripgrep 及交互式查找东西 fzf。经过将这几个指令的组合运用,再进一步进步咱们的终端运用功率。