Linux 中的模糊文件搜索
像 fzf 和 fzy 这样的现代工具将 Linux 终端中的文件搜索提升到了一个新的水平。
模糊搜索
像 fzf 和 fzy 这样的现代工具将 Linux 终端中的文件搜索提升到了一个新的水平。
![](/data/attachment/album/202306/24/001013mc7chh224c7uls8h.jpg)



> 
> 像 fzf 和 fzy 这样的现代工具将 Linux 终端中的文件搜索提升到了一个新的水平。
> 
> 
> 


在 Linux 命令行中，如何 [搜索文件](https://learnubuntu.com:443/find-files/)？你可以使用 [find 命令](https://linuxhandbook.com:443/find-command-examples/)。这是标准答案，没有问题。


通常，你键入带有搜索参数的命令，按回车键，然后它会显示搜索结果。


你可以通过模糊搜索来提升终端中的文件搜索体验。


模糊搜索是一种近似搜索算法或技术。在这种搜索中，通过名称搜索指定位置的文件，并实时显示结果给用户。


模糊搜索在网络搜索引擎中很受欢迎，用户开始输入术语后，它会开始显示与该术语相关的结果。


在本文中，我将讨论两个命令行工具，它们可以让你在 Linux 中执行模糊搜索：


* `fzf`：模糊查找工具
* `fzy`：模糊选择工具


### fzf：Linux 中的模糊查找工具


`fzf` 是一款可用于 Linux 的模糊搜索工具，你可以通过它进行交互式文件搜索。


在 Ubuntu 中安装 `fzf`，打开终端并运行以下命令：



```
sudo apt install fzf

```

虽然 `fzf` 本身可以正常工作，但最好与其他工具配合使用，以充分发挥其功能。


#### 使用 fzf


打开终端并运行：



```
fzf

```

这将打开一个 `fzf` 提示符，在当前工作目录中搜索文件。


![在终端中运行 fzf 命令](/data/attachment/album/202306/24/001037rvc2cbw43v3k2v0z.svg)


##### 为 fzf 应用边框


你可以使用 `--border` 选项为 `fzf` 应用边框，有多种边框可用，如 `rounded`（圆角）、`sharp`（尖角）等。



```
fzf --border=rounded

```

![运行带有边框选项设置为 rounded 和 sharp 的 fzf 命令](/data/attachment/album/202306/24/001037ydpbezx92ovsoza9.svg)


##### 应用背景和前景颜色


使用颜色属性，你可以为 `fzf` 设置 ANSI 颜色，可以作为背景、前景或两者都设置。


![为 fzf 应用颜色，用户指定了颜色](/data/attachment/album/202306/24/001038r6ljuk7ho0dljo7o.svg)



```
fzf --color="bg:black,fg:yellow"

```

你可以串联这些选项，使 `fzf` 在视觉上更加美观。


现在，让我展示一些 `fzf` 模糊搜索的实际用法。


#### 使用 fzf 在 Bash 历史中进行搜索


当然，Bash 历史记录中有 `CTRL+R` 的反向搜索功能。但如果你想使用 `fzf` 来获得更好的外观，可以运行以下命令：



```
history | fzf

```

![使用 fzf 模糊搜索在 bash 历史中进行搜索](/data/attachment/album/202306/24/001038rd93qq30nrrqqg33.svg)


#### 使用 fzf 结合 tree 命令


[tree 命令](https://linuxhandbook.com:443/tree-command/) 会列出文件和目录，并显示它们的层级关系。


使用 `fzf` 结合 `tree` 命令可以帮助你找到特定文件的绝对路径。



```
tree -afR /home/$USER | fzf

```

![运行 Tree 命令并将输出传递给模糊搜索](/data/attachment/album/202306/24/001038dy2iktz02f4fob4u.svg)



> 
> ? 上述命令会调用 `tree` 并以递归方式列出包括隐藏文件在内的所有文件（`-a`）。同时，`-f` 选项告诉 `tree` 列出完整路径。
> 
> 
> 


#### 在 fzf 中预览文件


有时，如果你可以获得你搜索的文件的小型预览，那会很有帮助。


幸运的是，`fzf` 提供了一个预览选项。你可以使用 `--preview` 来访问它。我在这里使用 `find` 命令使其更加有用。



```
find /home/$USER -type f | fzf --preview 'less {}'

```

在这里，当你滚动浏览结果时，它将使用 `less` 显示文本文件。



> 
> ? 如果你使用其他命令如 `ls` 等，请不要使用 `-l` 等选项，因为这将显示额外的详细信息（文件权限）。这些额外的详细信息会破坏 `fzf` 预览所需的格式。在使用预览功能时，输入到 `fzf` 的应该只是文件名。
> 
> 
> 


如果你已安装了 `bat`，也可以使用它来预览文件。



```
find /home/$USER -type f | fzf --preview 'bat --color always {}'

```

![使用 bat 作为 FZF 预览功能的文本查看器](/data/attachment/album/202306/24/001039umt7rlkzctrt7k7z.png)


对于 Ubuntu 用户，可以使用 `batcat` 来调用 `bat`。因此运行：



```
find /home/$USER -type f | fzf --preview 'batcat --color always {}'

```


> 
> ? [为这些命令创建别名](https://linuxhandbook.com:443/linux-alias-command/)，这样你就不需要反复输入它们。
> 
> 
> 


#### 从任何地方使用 fzf 进入任何目录（高级技巧）


这比以前要复杂一些。在这里，你不能直接将 `fzf` 和 `cd` 连接在一起，因为它们是不同的进程。


你可以创建一个别名并使用以下命令：



```
cd $(find /home/$USER -type d | fzf)

```

或者，你可以按照下面解释的方法进行操作。


为此，你可能需要在 `bashrc` 中添加一个函数。让我将这个函数称为 `finder`。现在请添加以下行到你的 `bashrc` 中。



```
finder() {
  local dir
  dir=$(find required/location/to/search/and/enter -type d | fzf)
  if [[ -n "$dir" ]]; then
    cd "$dir" || return
  fi
}

```

现在，你应该 [输入路径](https://itsfoss.com/change-directories/)，其中包含你要搜索并进入的目录。


例如，我已经使用 `/home/$USER` 替换了该部分，表示我要从任何位置进入我的主目录中的任何目录。


保存你的 `bashrc` 文件后，要么重启终端，要么运行以下命令：



```
source ~/.bashrc

```

之后，你可以在终端上运行 `finder` 命令，一旦找到要进入的目录，按回车键即可。


![使用 fzf 命令结合 cd 命令进入任意目录](/data/attachment/album/202306/24/001039du11z11el1u1mv1v.svg)


#### 将选择内容复制到剪贴板


到目前为止，你已经了解了如何使用 `fzf`，它提供了搜索结果或预览。


现在，如果你想要复制某个项目的位置，你不必手动执行此操作。也有相应的解决方案。


首先，确保你已经安装了 `xclip`。



```
sudo apt install xclip

```

然后像这样将其传递给 `xclip`：



```
fzf | xclip -selection clipboard

```

这将复制你按下回车键的那些行到剪贴板上。


#### 其他用途


正如我之前所说，你可以使用任何涉及大量文本，并希望交互式搜索特定内容的命令。


* `cat ~/.bashrc | fzf` - 在 Bashrc 文件中搜索
* `lsblk | fzf` - 在锁定设备列表中搜索
* `ps -aux | fzf` - 在进程列表中搜索


### 另一个选择：Fzy，模糊选择器


与 `fzf` 不同，`fzy` 是一个模糊选择器，它会根据输入提供一个菜单供你选择。


例如，如果你将 `fzy` 与 `ls` 命令一起使用，它将给你提供一个类似菜单的界面。


![使用 ls 命令的 fzy 命令](/data/attachment/album/202306/24/001039qggrh9u9euohu9oc.svg)


默认情况下，它会显示十个条目。


#### 使用 fzy 进入目录


与 `fzf` 类似，你也可以使用 `fzy` 进入当前工作目录中的目录：



```
cd $(find -type d | fzy)

```

![](/data/attachment/album/202306/24/001039ljyrmq0z1708srsr.svg)


#### 使用任何编辑器打开文件


或者使用你喜欢的编辑器打开文件：



```
nano $(find -type f | fzy)

```

![](/data/attachment/album/202306/24/001039zwwyygp1qe8cw8y3.svg)


### 附加内容：自定义文件和图像预览


下面的命令将在 **Ubuntu** 中打开一个专门的自定义提示符，用于模糊搜索，你可以通过滚动来预览文本文件。



```
find /home/$USER -type f | fzf --color="bg:black,fg:yellow" --preview 'batcat --color always {}' --preview-window=bottom

```

为了方便访问，可以在你的 `bashrc` 文件中为此创建一个别名。


或者在使用 `timg` 命令行图像查看器时，在 `fzf` 中进行图像预览并滚动。使用以下命令进行安装：



```
sudo apt install timg

```


> 
> ? 请注意，图像查看器无法正确显示图像，因为这不是 `fzf` 预览的主要目的。
> 
> 
> 



```
fzf --preview 'timg -g 200x100 {}' --preview-window=right:90

```

对于那些喜欢折腾的人，可以尝试对此部分进行优化。


### 现代化的替代方案


大多数 Linux 命令都是从 UNIX 时代继承下来的。它们虽然老旧，但功能如预期。但这并不意味着它们不能改进。


我的意思是，你不需要重新发明轮子，但你总是可以努力改进轮子。


像 `fzf` 和 `fzy` 这样的现代化工具将 Linux 终端中的文件搜索提升到了一个新的水平。以下是一些其他有趣的命令行工具。


我尝试给出了这些模糊搜索工具的一些实际示例。希望你对它们感到足够有启发性。如果你打算使用它们，请在评论中告诉我。


*（题图：MJ/d25e71fa-f24e-49be-9579-e0520a8f6e18）*




---


via: <https://itsfoss.com/fuzzy-file-search-linux/>


作者：[Sreenath](https://itsfoss.com/author/sreenath/) 选题：[lkxed](https://github.com/lkxed/) 译者：ChatGPT 校对：[wxy](https://github.com/wxy)


本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译，[Linux中国](https://linux.cn/) 荣誉推出

