Linux命令 fzf rg fd ag


原文链接: Linux命令 fzf rg fd ag

ag, fzf, fd, ripgrep

1. 交互接口 fzf, peco, zaw

fzf 是一個 fuzzy finder,就是 cmd+T 或是 ctrl+p 或是任何一個 文字編輯器/IDE 裡面不用打全名就可以找檔案的那個功能

預設用 find ,所以很慢,用環境變數可以換用 fd
export FZF_DEFAULT_COMMAND=‘fd –type f –follow –exclude .git’
ctrl+r 來搜尋歷史
**<tab> 可以選取多個檔案
ctrl+t 來搜尋檔案

2. 文本搜索 rg grep, ag, git grep, ucg, pt, sift

3. 目录搜索 find fd

fzf

调用 fzf 命令

直接在命令行输入 fzf 开始模糊查找
查找命令 匹配类型 说明
sbtrkt 模糊匹配 匹配sbtrkt
^music 前缀精确匹配 以music开头
.mp3^ 后缀精确匹配 以.mp3结尾
'wild 精确匹配(quoted) 精确包含wild
!fire inverse-exact-match 不包含fire
!.mp3$ inverse-suffix-exact-match 不以.mp3结尾

|可以做or匹配, 比如 ^core go$|rb$|py$ 表示以core开头,以go或rb或py结尾的
按键

ctrl-j/k 或者 ctrl-n/p 或者箭头来上下选择
ctrl-c 或者 Esc 退出
Enter 选择
在多行模式,tab 和 Shift-tab 来标记文件

除了这些按键之外,还可以使用 --bind 绑定自己的按键,见下文

选中之后,fzf 的默认操作是打印这个文件名,这样我们还得打开,所以可以直接 vim $(fzf) 也就是使用 vim 打开我们选中的文件。
使用快捷键

Ctrl-T 快速选择当前目录文件,并把文件名打印出来
Ctrl-R 使用fzf来过滤history命令
ALT-C cd 进入选中的目录

自动补全

fzf 支持不少命令的自动补全功能,通过 ** 来触发。如果没有特殊支持某个命令的话,fzf会用文件来补全。

vim **
cd **
ssh ** 从 /etc/hosts 中读取主机列表
unset **
export **
unalias **

kill -s TERM

这里我把触发按键设置成了 Ctrl-Y 比原生的触发更方便一点,如何配置见下文。
选项

--height xx% 默认情况下 fzf 占据了 100% 的屏幕
--reverse 提示符在上面
--bind 绑定命令
--preview 指定预览命令

默认情况下,在fzf中选中文件之后知识打印出这个文件名,可以使用bind来指定一些快捷键,来对文件的一些操作。

比如:

Press F1 to open the file with less without leaving fzf

Press CTRL-Y to copy the line to clipboard and aborts fzf (requires pbcopy)

fzf --bind 'f1:execute(less -f {}),ctrl-y:execute-silent(echo {} | pbcopy)+abort'

默认情况下,fzf 不会预览文件的内容,可以使用 --preview 指定,

Use head instead of cat so that the command doesn't take too long to finish

fzf --preview 'head -100 {}'

语法高亮

fzf --preview '[[ $(file --mime {}) =~ binary ]] &&

             echo {} is a binary file ||
             (highlight -O ansi -l {} ||
              coderay {} ||
              rougify {} ||
              cat {}) 2> /dev/null'

相关的环境变量

默认情况下,fzf 从 find * -type f 中读取文件列表,可以使用更好用的 fd 来替换。

export FZF_DEFAULT_OPTS='--height 40% --reverse --border' 这个变量来指定默认选项。
export FZF_DEFAULT_COMMAND='fd --type f' 来指定
export FZF_CTRL_T_COMMAND="$FZF_DEFAULT_COMMAND"

fd

fd 是一個類似 find 的檔案搜尋工具

也會預設排除 .gitignore
預設排除隱藏檔案
也是飛天快
也是 rust 實作

範例

用 regexp 搜尋
fd '[0-9]\.jpg$'
搜尋隱藏檔案跟被 ignore 的檔案
fd -H -I '[0-9]\.jpg$'
搜尋特定副檔名
fd -e jpg
對搜尋結果下指令平行執行
fd -e jpg -x convert {} {.}.png

rg

rg ripgrep is faster than {grep, ag, git grep, ucg, pt, sift}

[pt]()
It searches code about 3–5× faster than ack.
It searches code as fast as the_silver_searcher(ag).

time 统计时间

grep

time grep -r out_of_memory *
time grep out_of_memory $(find . -type f | grep -v '.git')

ack

time ack out_of_memory

ag

time ag out_of_memory

### pt

  1. Install
    go get -u github.com/monochromegane/the_platinum_searcher/
    curl -O https://github.com/monochromegane/the_platinum_searcher/releases/download/v2.1.4/pt_linux_amd64.tar.gz
  2. 使用
    $ # Recursively searchs for PATTERN in current directory.
    当前路径下搜索
    $ pt PATTERN

$ # You can specified PATH and some OPTIONS.
$ pt OPTIONS PATTERN PATH

  1. 配置
    If you put configuration file on the following directories, pt use option in the file.

    $XDG_CONFIG_HOME/pt/config.toml
    $HOME/.ptconfig.toml
    .ptconfig.toml (current directory)

    color = true
    context = 3
    ignore = ["dir1", "dir2"]
    color-path = "1;34"
    

    ack的使用案例

1.在当前目录递归搜索单词”eat”,不匹配类似于”feature”或”eating”的字符串:
$ ack -w eat

2.搜索有特殊字符的字符串’$path=.’,所有的元字符(比如’$',’.')需要在字面上被匹配:
$ ack -Q '$path=.' /etc

3.除了dowloads目录,在所有目录搜索”about”单词:
$ ack about --ignore-dir=downloads

4.只搜索包含’protected’单词的PHP文件,然后通过文件名把搜索结果整合在一起,打印每个文件对应的搜索结果:
$ ack --php --group protected

5.获取包含’CFLAG’关键字的Makefile的文件名。文件名为*.mk,makefile,Makefile,GNUmakefile的都在考虑范围内:
$ ack --make -l CFLAG

6.显示整个日志文件时高亮匹配到的字符串:
$ tail -f /var/log/syslog | ack --passthru 192.168.1.10

7.要换取ack支持的文件过滤类型,运行:
$ ack --help-type

`