跳到主要内容
  1. Skills/
  2. 善用工具/

fd, 替代 find 命令的工具

·字数 1394·3 分钟
fd

熟悉 linuxmacos 的开发者,对 find 命令并不陌生。这个命令用来帮助搜索文件,可按文件名称、文件类型、文件大小等方式来搜索文件。这个工具历史比较悠久。而近几年,一个叫 fd 的工具呈现在用户眼前,它是具有类似于 find 命令的工具,在大部分情况下,fd 是可以当成 find 的替代工具来使用,它的一个主要特点就是快。

fd ,使用 rust 实现,其源代码在 github.com 上公开。更新活跃、star 数高,是一个明星项目。

安装 #

  • macos 用户,可以使用 brew 安装, brew install fd
  • windows 用户,可以使用 scoop 安装,scoop install fd
  • linux 用户,可以使用 apt 安装,sudo apt install fd-find。注意,安装成功后,可执行程序的名称为 fdfind,为方便使用可使用 ln -s $(which fdfind) ~/.local/bin/fd 创建一个简短命令的链接
  • rust 用户的,可以克隆 github 上的源代码,然后自行编译
  • 还可以到 发布页 下载二进制版本

使用 #

fd 的主要功能是替代 find,本文并不罗列所有功能,仅是从主要的使用场景来举例,大致的使用场景有,按文件名搜索、搜索后将结果做为参数输入执行命令,搜索时的主要增强选项介绍(如隐藏文件、大小写、文件类型等)

下面按照类比 fdfind 的方式,来介绍 fd 的主要功能。

版本:

  • fd: 8.2.1
  • find: macos 11

总体而言,体验差别是,fd 会尽可能的把结果找出来,如果太多,添加过滤选项来减少搜索结果;而 find 会尽可能按照你的要求选出最尽可能少的结果。

按名称搜索文件 #

> # 假设搜索当前目录名称为 config 的文件与目录
> find . -name "config"
> # 搜索当前目录下名称包含 config 的文件与目录
> find . -name "config*"
> # 搜索当前目录下名称包含 config 的文件与目录
> fd config

要达到相同的搜索结果,使用 fd 的命令似乎要简短一些,没有过多的默认限制,在盲搜时可以扫出更多的结果。当然,使用 find 同样也可以达到与 fd 接近的结果。

不管两者的设计哲学是否相同,但两者的使用体验确实不一样。

为什么我会喜欢使用 fd 而不是 find 呢,其实并不是因为 fd 的执行速度非常快,而是 fd 让我感觉到它的命令格式更加简洁,更能达到我快速搜索的目的。当然 find 也可以做到,只是我老是把 find 的命令形式写错。 fd 的使用更加符合我的习惯,直接使用 fd 名称 的形式来执行我想要的搜索。

指定搜索的文件类型 #

上例中分别比较了 fdfind 的按名称搜索时的差别。但有的确我们需要对结果进行一些限制。比如只搜索目录名称、或者只搜索出文件。

> # find: 只列出名称包含 config 的目录
> find . -type d -name "config*"
> # fd: 只列出名称包含 config 的目录
> fd -t d config

在搜索结果上执行命令 #

『使用搜索工具搜索出结果后,并逐一执行某个命令进行处理』,这时我们会想到使用 xargs 来接收每一行参数,并与命令对接。但是 findfd 均以提供一个选项来指定对每一个结果执行处理的命令。

  • find -exec 命令 {} +
  • fd -x “命令 {}”

这两者的形式非常接近,都是采用了 {} 来表示结果中的每一行。唯一区别的,find 需要使用 + 来结束整个命令(如果没有认真阅读官方使用手册的,怎么可能猜得到这里需要一个 + 符号呢)。

> # find: 列名称包含 config 的文件与目录,并判断他们的文件类型
> find . -name "config*" -exec file {} +
> # fd: 列出名称包含 config 的文件与目录,并判断他们的文件类型
> fd config -x file {}

ignore规则 #

值得一提的,fd 诞生在 git 时代,默认会过滤我们非常可能不关心的目录,比如 .gitnode_modules 这些非工程源码的目录。

fd 会忽略掉 .gitignore.ignore.fdignore 这里文件中标注的名称。 使用 fd -uu 名称 可以使 fd 关闭掉这个功能,扫描全部可能的匹配。

即使 fd 有 ignore 功能,可以利用这个特性来忽略你不想搜索的目录或文件。