12 - fzf - 档案与目录模糊搜寻指令工具

当我们要找寻一个档案时,很多时候都只会记得档案的部分资讯,可能是部分的路径或是名称,我们可以使用这些资讯对电脑下达 findfd 之类的查找指令,但是人的记忆总有疏漏,可能这些资讯是错误或是过於笼统的,我们必须要再次地增删查找字串来取得想要的结果,这样一来一往,我们会使用很多的查找指令,在这样的来回输入时,时间就会被浪费了。

因此,查找资料最好的方式就是像是 Finder 或 File Explorer 那样可以轻松地进出上下层目录,并且提供搜寻功能的应用程序。

而想要不离开终端机,我们就需要一个可以交互(因要变更目录或搜寻对象)的查找指令。

终端机的档案总管 - fzf

https://ithelp.ithome.com.tw/upload/images/20210928/20107789Ex4kKuBXmk.png

fzf 是个命令列的模糊搜寻器,它会以输入字串为搜寻目标,列出可能的结果清单,使用者可以在这个清单上选择出符合的结果,如果没有期望的结果,也可以即时地删除或增加资讯,藉以找到目标。

安装 fzf

使用 Homebrew 安装 fzf

brew install fzf

安装完成後,还要另外执行 fzfinstall 脚本:

$(brew --preview)/opt/fzf/install

脚本的路径取决於 Homebrew 的安装路径,因此需要使用 brew --preview 取得安装目录。

此脚本会进行键的绑定与模糊补全的设置。

执行完成後,请重新启动终端机,让安装生效。

使用 fzf

执行 fzf 命令就可以叫出当前目录的列表,使用者可以输入字串来限缩列表的结果。

fzf

https://ithelp.ithome.com.tw/upload/images/20210928/20107789N0WkQHeYkX.png

预设输入的字串是采取模糊搜寻,因此只要有匹配的目录或档案就会输出在结果上。

除了模糊搜寻, fzf 提供了各种前缀( prefix )让我们使用不同的搜寻方式:

输入字串 动作 说明
sbtrkt 模糊匹配 sbtrkt 中的任意字元匹配的物件
'wild 精确匹配 wild 字串匹配的物件
^music 前缀精确匹配 物件的开头需是 music 字串
.mp3$ 後缀精确匹配 物件的结尾需是 .mp3 字串
!fire 反向精确匹配 物件中不能有 fire 字串
!^music 反向前缀匹配 物件的开头不能是 music 字串
!.mp3$ 反向後缀匹配 物件的结尾不能是 .mp3 字串

输入多个字串时, fzf 会以 AND (且)的搜寻方式处理各个字串,如果要使用 OR (或)搜寻的话,可以使用 | 隔开多个字串。

days tmux .md$ | .drawio$

https://ithelp.ithome.com.tw/upload/images/20210928/20107789FmBLTv2A0q.png

当在列表上看到期望的目标时,我们可以使用下面的方式操作 fzf 以选取结果:

  • 使用 CTRL-KCTRL-J (或 CTRL-PCTRL-N )上下移动。
  • 点击 Enter 选取物件。
  • 使用 CTRL-CCTRL-GESC 离开 fzf
  • 使用滑鼠选取。

加上 -m 参数,可以开启多选模式:

fzf -m

在多选模式下可以使用 TABShift-TAB 上下多选物件。

https://ithelp.ithome.com.tw/upload/images/20210928/20107789VbF42GAUXl.png

如要取消选择,可以在以选取的物件上再输入一次 TABShift-TAB

快捷键

fzf 预设三个快捷键供使用者使用:

  • CTRL-T :所选的物件会贴至命令列。
  • CTRL-R :开启历史指令列表,所选的指令会贴至命令列。
  • ALT-C :会移动至所选的目录。

模糊补全

有时,我们会在下指令时忘记目标的完整名称,这时我们可以使用 fzf 的模糊补全功能来找到想要的物件。

档案与目录

fzf 的档案与目录的模糊补全是使用 ** 作为关键字,并按下 TAB 後触发,它的定义为 COMMAND [DIRECTORY/][FUZZY_PATTERN]**<TAB>

# 当前目录下搜寻
cd **<TAB>

# 当前目录下搜寻 `fzf`
cd fzf**<TAB>

# `days` 目录下搜寻 `fzf`
cd days/fzf**<TAB>

https://ithelp.ithome.com.tw/upload/images/20210928/20107789LKJglCwJiv.png

程序 ID

当想要关闭特定的程序时,我们会使用 kill 指令, fzf 会智能地判断指令,并输出程序列表。

kill -9 <TAB>

https://ithelp.ithome.com.tw/upload/images/20210928/20107789LiO9uOBo1Y.png

此状态下 fzf 为多选模式,可以使用 TABShift-TAB 选取多个程序。

Host 名称

在输入 sshtelnet 指令时, fzf 会从 /etc/hosts~/.ssh/config 中取得 Host 名称列表。

ssh **<TAB>
telnet **<TAB>

https://ithelp.ithome.com.tw/upload/images/20210928/201077892GAX4xMuLQ.png

环境变数/别名

在输入环境变数与别名相关的指令时, fzf 会取得其列表。

unset **<TAB>
export **<TAB>
unalias **<TAB>

https://ithelp.ithome.com.tw/upload/images/20210928/20107789rSpiEJnFWE.png

与 Zim 整合

Zim 官方提供了 fzf 的 Module ,它将 fzf 的搜寻指令以 fdripgrep 取代预设的 find ,并且在按下 CTRL-T 时,使用 BAT 进行预览的动作。

需要先安装 fd (或 ripgrep )与 BAT

https://ithelp.ithome.com.tw/upload/images/20210928/20107789D70Cc8q3ym.png

本文重点整理

  • fzf 是个命令列的模糊搜寻器,在查找物件时使用。
  • 输入 fzf 或是键入 CTRL-T 开启档案与目录查找。
  • 键入 CTRL-R 查找历史指令。
  • 键入 ALT-C 移动至查找的物件。
  • 在搜寻时, fzf 提供各种前缀字来修改原本预设的模糊搜寻方式。
    • ' :完整搜寻。
    • ^ :开头相符。
    • $ :结尾相符。
    • ! :反向搜寻。
  • 使用键盘选取物件时:
    • CTRL-KCTRL-J (或 CTRL-PCTRL-N )移动。
    • Enter 选取。
    • CTRL-CCTRL-GESC 离开。
  • 使用滑鼠可以在列表的各个物件中移动与选取。
  • 在输入不同指令时,可以使用 TAB 来启动模糊补全。
    • 预设使用 **<TAB> 开启档案与目录列表。
    • kill 指令: TAB 输入开启程序列表。
    • sshtelnet 指令: **<TAB> 输入开启 Host 名称列表。
    • 环境变数与别名指令: **<TAB> 输入开启变数或别名列表。
  • 与 Zim 的 fzf Module 整合,可以让 fzf 使用 fd (或 ripgrep )及 BAT 优化功能。

参考资料


<<:  [第13天]理财达人Mx. Ada-期货(futures)下单

>>:  Flutter体验 Day 20-Provider

[DAY 29] Google 提供的图片转文字

现在有一些还不错的网站有在蒐集各校段考考古题 例如:全国中小学题库网、昌爸工作坊 等等 由於我国着作...

[DAY28] 战略设计的别扭事件

上一篇提到,要深入了解需求,需要大量的沟通,对应到 DDD 中非常重要的一环——与领域专家一同开会。...

Day32 ( 游戏设计 ) 太空狗闪躲陨石

太空狗闪躲陨石 教学原文参考:太空狗闪躲陨石 这篇文章会介绍,如何在 Scratch 3 里使用键盘...

自动化 End-End 测试 Nightwatch.js 之踩雷笔记:关闭多视窗

昨天利用了 window.open 可以开启新分页或视窗,今天则是来关闭多个视窗。 Nightwat...

D25 - 用 Swift 和公开资讯,打造投资理财的 Apps { 三大法人成交比重 资料分析 }

台湾股市有揭露三大法人当日买进卖出的金额,在市场上会有流派依照这些进出的资讯,调整手上的资金部位。因...