Linux 下的 find 命令自身就比较复杂,想要查找本地文件时通常需要敲一系列的命令,这时候 fd 就出来解决这个问题了。

最简单的 fd 命令就只需要:

fd [pattern] [path...]

但如果需要使用 find 命令,那么需要:

find ./ -name '*test*' -type f

并且 fd 命令要比 find 命令快很多。

fd 由 Rust 实现。

GitHub: https://github.com/sharkdp/fd

Use case

List all files

fd 可以直接不添加任何参数执行,当想要快速查看目录下所有内容时非常有用,类似于 ls -R

如果想要递归的显示目录下,包括子目录所有的内容,可以使用:

fd . /path/to/dir

查看包含关键字的文件

比如查看本地包含 mysql 的文件:

fd "mysql"

对于 ag 命令则需要

ag -g "mysql" .

而 find 则更加复杂

find ./ -name '*mysql*' -type f

搜索特定的文件后缀

使用 -e 选项来搜索目录下所有的 Markdown 文件(.md):

fd -e md

使用准确的搜索 PATTERN 搜索

使用 -g 选项:

fd -g libc.so /usr

找出目录下文件并删除

首先使用 fd 找出文件名,使用 xargs 发送给 rm(注意小心执行该该命令):

fd "keyword" -x rm -v

在很多情况下,我们不仅要找出搜索结果,还需要对搜索结果执行一些操作,上面提到的删除就是比较常见的,fd 提供了两种方式来对结果执行命令:

  • -x/--exec 并行地对每一个结果执行额外的命令
  • -X/--exec-batch 只执行额外的命令一次,将所有的结果作为参数

比如更复杂一些的,递归地找到所有的 zip 文件,然后解压:

fd -e zip -x unzip

如果目录下有两个文件 file1.zipbackup/file2.zip ,那么这一行命令之后会并行执行 unzip file1.zipunzip backup/file2.zip

再比如将目录下所有的 *.jpg 转换成 *.png:

fd -e jpg -x convert {} {.}.png

这里,{} 是搜索结果的一个占位符,{.} 类似,表示文件名无后缀。

还有一个常见,比如要搜索目录下所有的 test_*.py 然后用 vim 打开:

fd -g 'test_*.py' -X vim

或者查看文件的权限、所有者、大小等等:

fd ... -X ls -lhd

-X 命令结合 rg 命令一起使用的时候也非常方便:

fd -e cpp -e cxx -e h -e hpp -X rg 'std::cout'

上面这句话的意思就是找到这些文件后缀的文件中包含 std::cout 的内容。

区分查找的类别

使用 -t 命令来区别要查找的内容

f, file  		普通文件
d, directories 		目录
l, symlink 			symbolic links
x, executable 		可执行文件
e 					空文件或者目录

在 Vim 中使用

installation

安装及配置参考官方:

reference