这是 HelloGitHub 推出的《讲解开源项目》系列,用一篇文章带你快速上手有趣的开源项目。
今天给大家推荐一个好用+开源的文件搜索工具——fd
该工具支持大多数主流操作系统,快来更新你的工具箱感受开源项目带来的便利吧!
一、fd 简介你还在为寻找文件而烦恼吗?你还在为记不住 find 一大堆参数而烦恼吗?那就赶快来看看我这次推荐的项目 fd 吧!
项目地址:https://github.com/sharkdp/fd
官方简介:A simple, fast and user-friendly alternative to 'find'
我这里先放一个图,让大家直观地感受下
fd 是一个命令行工具,提供了多种方便的选项进行文件的搜索,而且默认是彩色输出。项目本身是由 Rust 语言编写的,作为系统级编程语言 Rust 拥有媲美 C++ 的运行速度,那 fd 的速度自然也不在话下,更优秀的是,它提供了强大功能方便用户按照各种条件进行搜索。
这个优秀的项目是不是成功地引起了你的注意呢~
二、fd 如何安装作为使用的第一步当然是要先安装啦~
fd 提供了各个操作系统平台的安装方式,再不济可以直接通过源码进行安装(前提是有 Rust 的环境噢)
2.1 一键安装我这里以我本地的 Mac 使用 brew 为例
$ brew install fdbrew 也可以一键升级
$ brew upgrade fd具体到各个平台的详细安装方法,你可以看这里 安装文档
2.2 源码安装$ git clone https://github.com/sharkdp/fd.git$ cd fd$ cargo install --path .2.3 查看帮助无论哪种方式安装完成后,就可以直接使用了 -h 或 --help 获取帮助了,--help 就不演示了,区别就是换成了详细的帮助说明,如果你以后忘记了某一个参数也记得使用 --help 来查看哦~
$ fd -hfd 8.2.1
USAGE:fd [FLAGS/OPTIONS] [
FLAGS:-H, --hidden 搜索隐藏的文件和目录-I, --no-ignore 不要忽略 .(git | fd)ignore 文件匹配--no-ignore-vcs 不要忽略.gitignore文件的匹配-s, --case-sensitive 区分大小写的搜索(默认值:智能案例)-i, --ignore-case 不区分大小写的搜索(默认值:智能案例)-F, --fixed-strings 将模式视为文字字符串-a, --absolute-path 显示绝对路径而不是相对路径-L, --follow 遵循符号链接-p, --full-path 搜索完整路径(默认值:仅限 file-/dirname)-0, --print0 用null字符分隔结果-h, --help 打印帮助信息-V, --version 打印版本信息
OPTIONS:-d, --max-depth
该目录大致是这样:
.├── .hg│ ├── HelloDjango.md│ ├── HelloRust.md│ ├── HelloVue.md│ ├── HelloZooKeeper.md├── dir1│ ├── Hello.java│ ├── World.java│ └── dir2│ ├── demo.py│ ├── demo1.py│ ├── dir3│ │ ├── fd_demo.rs│ │ └── fd_help.rs│ └── sss.py├── hello_fd.md├── hello_java.md├── java│ ├── Hello.java│ └── World.java├── my_java.txt├── python│ ├── demo.py│ ├── demo1.py│ └── sss.py└── rust│ ├── fd_demo.rs│ └── fd_help.rs├── softdir3 -> dir1/dir2/dir3└── sss.py -> dir1/dir2/sss.py3.1 简单搜索fd 直接跟想要搜索的内容,会递归搜索当前目录下的所有文件,列出文件名中包含目标内容的结果(结果为当前目录的相对路径)
$ fd Hellodir1/Hello.javajava/Hello.java3.2 包含隐藏目录选项 -H 或 --hidden
$ fd -H Hello.hg/HelloDjango.md.hg/HelloRust.md.hg/HelloVue.md.hg/HelloZooKeeper.mddir1/Hello.javajava/Hello.java3.3 大小写默认 fd 是匹配智能大小写的,如果你搜索的内容是包含大写会按照大小写精确匹配,但如果是小写会忽略大小写匹配,所以 fd 另外提供了两种选项来严格控制大小写匹配
选项 -i 或 --ignore-case 忽略大小写。
$ fd -i Hellodir1/Hello.javahello_fd.mdhello_java.mdjava/Hello.java选项 -s 或 --case-sensitive 严格匹配大小写。
$ fd -s hellohello_fd.mdhello_java.md3.4 返回绝对路径选项 -a 或 --absolute-path:
$ fd -a Hello/Users/junjiexun/fd_test/dir1/Hello.java/Users/junjiexun/fd_test/java/Hello.java3.5 返回文件列表详情选项 -l 或 --list-details 获得类似 ls -l 的效果。
$ fd -l hello-rw-r--r-- 1 junjiexun staff 0B 3 1 18:42 dir1/Hello.java-rw-r--r-- 1 junjiexun staff 0B 3 1 18:37 hello_fd.md-rw-r--r-- 1 junjiexun staff 0B 3 1 18:37 hello_java.md-rw-r--r-- 1 junjiexun staff 0B 3 1 18:38 java/Hello.java3.6 搜索内容包含路径选项 -p 或 --full-path 不单单搜索文件名,还列出目录中包含目标内容的结果。
因为这个测试的目录就在 /Users/junjiexun 下面,所以这样搜索相当于全部的文件都会被搜索出来。
$ fd xunNothing return...$ fd -p xundir1dir1/Hello.javadir1/World.javadir1/dir2...(略)3.7 包括 .gitignore 里的文件选项 -I 或 --no-ignore 我这里新建了一个 .gitignore 文件内容只有一个 *.java 用来演示,并且需要把当前目录通过 git init 初始化成 git 的项目。
不加该参数,可以看到结果集中 .java 的文件都被过滤了。
$ fd javahello_java.mdjavamy_java.txt加上了 -I 之后结果中又包括了 .java 结尾的文件了。
$ fd -I javadir1/Hello.javadir1/World.javahello_java.mdjavajava/Hello.javajava/World.javamy_java.txt-I 功能我演示完了,为了之后的演示,我将 .gitignore 和 .git 目录给删除了。
这些简单的功能已经可以满足一半的日常搜索需求了,接下来我们看看 fd 提供的更高级的搜索选项吧!
四、高级搜索选项4.1 按深度选项 -d 或 --max-depth
$ fd rsdir1/dir2/dir3/fd_demo.rsdir1/dir2/dir3/fd_help.rsrust/fd_demo.rsrust/fd_help.rs$ fd -d 3 rsrust/fd_demo.rsrust/fd_help.rs4.2 按文件类型选项 -t 或 --type
f:filed:directoryl:symlinkx:executablee:emptys:socketp:pipe$ fd -t lsoftdir3sss.py$ fd -t ddir1dir1/dir2dir1/dir2/dir3javapythonrust我给所有的 py 文件都加了可执行权限
$ fd -t xpython/demo.pypython/demo1.pypython/sss.py4.3 按扩展名选项 -e 或 --extension
$ fd -e mdhello_fd.mdhello_java.md4.4 排除选项 -E 或 --exclude
$ fd -E 's'dir1dir1/Hello.javadir1/World.javadir1/dir2dir1/dir2/demo.pydir1/dir2/demo1.pydir1/dir2/dir3hello_fd.mdhello_java.mdjavajava/Hello.javajava/World.javamy_java.txtpythonpython/demo.pypython/demo1.py可以看到所有的 rust、rs、sss、soft 都没有出现在结果集中。
4.5 按所有者选项 -o 或 --owner
$ fd -l -o junjiexundrwxr-xr-x 5 junjiexun staff 160B 3 1 18:42 dir1-rw-r--r-- 1 junjiexun staff 0B 3 1 18:42 dir1/Hello.java-rw-r--r-- 1 junjiexun staff 0B 3 1 18:42 dir1/World.javadrwxr-xr-x 6 junjiexun staff 192B 3 1 18:42 dir1/dir2-rw-r--r-- 1 junjiexun staff 0B 3 1 18:42 dir1/dir2/demo.py...(略)或者 fd -l -o junjiexun:staff 也可以达到同样的效果,但是 fd 不支持单独搜索 group,也不支持通配符,如果你有想法的话可以给他提 issue 哦~
4.6 组合命令fd 提供了 -x 或 --exec
找到所有和 java 匹配的内容并且删除!(仅仅用做演示,rm -rf 慎用)
$ fd java -X rm -rf找到所有的 py 并且通过 vim 打开
$ fd py -X vim还可以使用诸如 unzip、ls、convert 等等其他常用的命令,也可以直接使用 *unix 语法 | 管道符语法进一步处理。
4.7 正则表达式对于文件的内容搜索,我之前演示的是诸如 Hello、java、py 都是这样的完整文本,实际 fd 默认就是支持正则表达式对内容进行搜索的,但是正则表达式需要使用单引号 ' 包裹起来,我下面演示:将所有 s 开头的文件都能被搜索出来。
$ fd '^s.*'dir1/dir2/sss.pypython/sss.pysoftdir3sss.py如果你不想使用正则表达式,想换成更简单的通配符匹配的话就可以使用选项 -g 或 --glob 可以达到同样的效果。
$ fd -g 's*'dir1/dir2/sss.pypython/sss.pysoftdir3sss.py上面的选项大部分都是可以同时使用的,篇幅有限我这里就不继续演示了。
五、总结fd 是一个简单友好的命令行文件搜索工具,而且其开源的属性作为 Rust 源码学习的对象也是非常优秀的,赶紧学起来吧!