mirror of
https://github.com/LCTT/TranslateProject.git
synced 2024-12-23 21:20:42 +08:00
294 lines
9.5 KiB
Markdown
294 lines
9.5 KiB
Markdown
|
[#]: subject: "Fuzzy File Search in Linux"
|
|||
|
[#]: via: "https://itsfoss.com/fuzzy-file-search-linux/"
|
|||
|
[#]: author: "Sreenath https://itsfoss.com/author/sreenath/"
|
|||
|
[#]: collector: "lkxed"
|
|||
|
[#]: translator: "ChatGPT"
|
|||
|
[#]: reviewer: "wxy"
|
|||
|
[#]: publisher: "wxy"
|
|||
|
[#]: url: "https://linux.cn/article-15937-1.html"
|
|||
|
|
|||
|
Linux 中的模糊文件搜索
|
|||
|
======
|
|||
|
|
|||
|
![][0]
|
|||
|
|
|||
|
> 像 fzf 和 fzy 这样的现代工具将 Linux 终端中的文件搜索提升到了一个新的水平。
|
|||
|
|
|||
|
在 Linux 命令行中,如何 [搜索文件][1]?你可以使用 [find 命令][2]。这是标准答案,没有问题。
|
|||
|
|
|||
|
通常,你键入带有搜索参数的命令,按回车键,然后它会显示搜索结果。
|
|||
|
|
|||
|
你可以通过模糊搜索来提升终端中的文件搜索体验。
|
|||
|
|
|||
|
模糊搜索是一种近似搜索算法或技术。在这种搜索中,通过名称搜索指定位置的文件,并实时显示结果给用户。
|
|||
|
|
|||
|
模糊搜索在网络搜索引擎中很受欢迎,用户开始输入术语后,它会开始显示与该术语相关的结果。
|
|||
|
|
|||
|
在本文中,我将讨论两个命令行工具,它们可以让你在 Linux 中执行模糊搜索:
|
|||
|
|
|||
|
- `fzf`:模糊查找工具
|
|||
|
- `fzy`:模糊选择工具
|
|||
|
|
|||
|
### fzf:Linux 中的模糊查找工具
|
|||
|
|
|||
|
`fzf` 是一款可用于 Linux 的模糊搜索工具,你可以通过它进行交互式文件搜索。
|
|||
|
|
|||
|
在 Ubuntu 中安装 `fzf`,打开终端并运行以下命令:
|
|||
|
|
|||
|
```
|
|||
|
sudo apt install fzf
|
|||
|
```
|
|||
|
|
|||
|
虽然 `fzf` 本身可以正常工作,但最好与其他工具配合使用,以充分发挥其功能。
|
|||
|
|
|||
|
#### 使用 fzf
|
|||
|
|
|||
|
打开终端并运行:
|
|||
|
|
|||
|
```
|
|||
|
fzf
|
|||
|
```
|
|||
|
|
|||
|
这将打开一个 `fzf` 提示符,在当前工作目录中搜索文件。
|
|||
|
|
|||
|
![在终端中运行 fzf 命令][3]
|
|||
|
|
|||
|
##### 为 fzf 应用边框
|
|||
|
|
|||
|
你可以使用 `--border` 选项为 `fzf` 应用边框,有多种边框可用,如 `rounded`(圆角)、`sharp`(尖角)等。
|
|||
|
|
|||
|
```
|
|||
|
fzf --border=rounded
|
|||
|
```
|
|||
|
|
|||
|
![运行带有边框选项设置为 rounded 和 sharp 的 fzf 命令][4]
|
|||
|
|
|||
|
##### 应用背景和前景颜色
|
|||
|
|
|||
|
使用颜色属性,你可以为 `fzf` 设置 ANSI 颜色,可以作为背景、前景或两者都设置。
|
|||
|
|
|||
|
![为 fzf 应用颜色,用户指定了颜色][5]
|
|||
|
|
|||
|
```
|
|||
|
fzf --color="bg:black,fg:yellow"
|
|||
|
```
|
|||
|
|
|||
|
你可以串联这些选项,使 `fzf` 在视觉上更加美观。
|
|||
|
|
|||
|
现在,让我展示一些 `fzf` 模糊搜索的实际用法。
|
|||
|
|
|||
|
#### 使用 fzf 在 Bash 历史中进行搜索
|
|||
|
|
|||
|
当然,Bash 历史记录中有 `CTRL+R` 的反向搜索功能。但如果你想使用 `fzf` 来获得更好的外观,可以运行以下命令:
|
|||
|
|
|||
|
```
|
|||
|
history | fzf
|
|||
|
```
|
|||
|
|
|||
|
![使用 fzf 模糊搜索在 bash 历史中进行搜索][6]
|
|||
|
|
|||
|
#### 使用 fzf 结合 tree 命令
|
|||
|
|
|||
|
[tree 命令][7] 会列出文件和目录,并显示它们的层级关系。
|
|||
|
|
|||
|
使用 `fzf` 结合 `tree` 命令可以帮助你找到特定文件的绝对路径。
|
|||
|
|
|||
|
```
|
|||
|
tree -afR /home/$USER | fzf
|
|||
|
```
|
|||
|
|
|||
|
![运行 Tree 命令并将输出传递给模糊搜索][8]
|
|||
|
|
|||
|
> 💡 上述命令会调用 `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 预览功能的文本查看器][9]
|
|||
|
|
|||
|
对于 Ubuntu 用户,可以使用 `batcat` 来调用 `bat`。因此运行:
|
|||
|
|
|||
|
```
|
|||
|
find /home/$USER -type f | fzf --preview 'batcat --color always {}'
|
|||
|
```
|
|||
|
|
|||
|
> 💡 [为这些命令创建别名][10],这样你就不需要反复输入它们。
|
|||
|
|
|||
|
#### 从任何地方使用 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
|
|||
|
}
|
|||
|
```
|
|||
|
|
|||
|
现在,你应该 [输入路径][11],其中包含你要搜索并进入的目录。
|
|||
|
|
|||
|
例如,我已经使用 `/home/$USER` 替换了该部分,表示我要从任何位置进入我的主目录中的任何目录。
|
|||
|
|
|||
|
保存你的 `bashrc` 文件后,要么重启终端,要么运行以下命令:
|
|||
|
|
|||
|
```
|
|||
|
source ~/.bashrc
|
|||
|
```
|
|||
|
|
|||
|
之后,你可以在终端上运行 `finder` 命令,一旦找到要进入的目录,按回车键即可。
|
|||
|
|
|||
|
![使用 fzf 命令结合 cd 命令进入任意目录][12]
|
|||
|
|
|||
|
#### 将选择内容复制到剪贴板
|
|||
|
|
|||
|
到目前为止,你已经了解了如何使用 `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 命令][13]
|
|||
|
|
|||
|
默认情况下,它会显示十个条目。
|
|||
|
|
|||
|
#### 使用 fzy 进入目录
|
|||
|
|
|||
|
与 `fzf` 类似,你也可以使用 `fzy` 进入当前工作目录中的目录:
|
|||
|
|
|||
|
```
|
|||
|
cd $(find -type d | fzy)
|
|||
|
```
|
|||
|
|
|||
|
![][14]
|
|||
|
|
|||
|
#### 使用任何编辑器打开文件
|
|||
|
|
|||
|
或者使用你喜欢的编辑器打开文件:
|
|||
|
|
|||
|
```
|
|||
|
nano $(find -type f | fzy)
|
|||
|
```
|
|||
|
|
|||
|
![][15]
|
|||
|
|
|||
|
### 附加内容:自定义文件和图像预览
|
|||
|
|
|||
|
下面的命令将在 **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][a]
|
|||
|
选题:[lkxed][b]
|
|||
|
译者:ChatGPT
|
|||
|
校对:[wxy](https://github.com/wxy)
|
|||
|
|
|||
|
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
|||
|
|
|||
|
[a]: https://itsfoss.com/author/sreenath/
|
|||
|
[b]: https://github.com/lkxed/
|
|||
|
[1]: https://learnubuntu.com:443/find-files/
|
|||
|
[2]: https://linuxhandbook.com:443/find-command-examples/
|
|||
|
[3]: https://itsfoss.com/content/images/2023/06/fzf-default.svg
|
|||
|
[4]: https://itsfoss.com/content/images/2023/06/fzf-border.svg
|
|||
|
[5]: https://itsfoss.com/content/images/2023/06/fzf-colored.svg
|
|||
|
[6]: https://itsfoss.com/content/images/2023/06/search-within-bash-history.svg
|
|||
|
[7]: https://linuxhandbook.com:443/tree-command/
|
|||
|
[8]: https://itsfoss.com/content/images/2023/06/tree-afr.svg
|
|||
|
[9]: https://itsfoss.com/content/images/2023/06/bashrc-preview-in-fzf.png
|
|||
|
[10]: https://linuxhandbook.com:443/linux-alias-command/
|
|||
|
[11]: https://itsfoss.com/change-directories/
|
|||
|
[12]: https://itsfoss.com/content/images/2023/06/fzf-cd-combo.svg
|
|||
|
[13]: https://itsfoss.com/content/images/2023/06/fzy-ls.svg
|
|||
|
[14]: https://itsfoss.com/content/images/2023/06/fzy-cd.svg
|
|||
|
[15]: https://itsfoss.com/content/images/2023/06/fzy-nano.svg
|
|||
|
[0]: https://img.linux.net.cn/data/attachment/album/202306/24/001013mc7chh224c7uls8h.jpg
|