王尘宇王尘宇

研究百度干SEO做推广变成一个被互联网搞的人

一款开源的文件搜索神器,终于不用记find命令了

这是 HelloGitHub 推出的《讲解开源项目》系列,用一篇文章带你快速上手有趣的开源项目。

今天给大家推荐一个好用+开源的文件搜索工具:

fd 支持大多数主流操作系统,快来更新你的工具箱感受开源项目带来的便利吧!

一、fd 简介

你还在为寻找文件而烦恼吗?你还在为记不住find一大堆参数而烦恼吗?那就赶快来看看我这次推荐的项目 fd 吧!

官方简介:A simple, fast and user-friendly alternative to find

我这里先放一个图,让大家直观地感受下

fd 是一个命令行工具,提供了多种方便的选项进行文件的搜索,而且默认是彩色输出。项目本身是由 Rust 语言编写的,作为系统级编程语言 Rust 拥有媲美 C++ 的运行速度,那 fd 的速度自然也不在话下,更优秀的是,它提供了强大的功能方便用户按照各种条件进行搜索。

这个优秀的项目是不是成功地引起了你的注意呢~

二、fd 如何安装

作为使用的第一步当然是要先安装啦~

fd 提供了各个操作系统平台的安装方式,再不济可以直接通过源码进行安装(前提是有 Rust 的环境噢)

2.1 一键安装

我这里以我本地的 Mac 使用brew为例

$ brew install fd

brew也可以一键升级

$ brew upgrade fd

具体到各个平台的详细安装方法,你可以看这里 安装文档

2.2 源码安装

$gitclonehttps://github.com/sharkdp/fd.git$cdfd$cargo install --path .

2.3 查看帮助

无论哪种方式安装完成后,就可以直接使用了-h--help获取帮助了,--help就不演示了,区别就是换成了详细的帮助说明,如果你以后忘记了某一个参数也记得使用--help来查看哦~

$ fd -hfd8.2.1USAGE:fd [FLAGS/OPTIONS] [] [<path>...]

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 设置最大搜索深度(默认值:无)-t,--type ... 按类型过滤:文件(f),目录(d),符号链接(l),可执行(x),空(e)-e,--extension ... 按文件扩展名过滤-x,--exec 为每个搜索结果执行命令-E,--exclude ... 排除与给定glob模式匹配的条目--ignore-file ... 以.gitignore格式添加自定义忽略文件-c,--color 何时使用颜色:never,*auto*, always-j,--threads 设置用于搜索和执行的线程数-S,--size ... 根据文件大小限制结果。...

三、fd 快速上手演示

为了能让之后的演示有一个统一的认识,我在这里新建了一个目录作为 fd 的测试目录,我虚构了一些文件和目录来模拟实际情况,包括一个隐藏目录,我之后的演示都会基于该根目录下,选项如果有短名称和长名称,示例中以短名称为例。

该目录大致是这样:

.

├── .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.py

3.1 简单搜索

fd直接跟想要搜索的内容,会递归搜索当前目录下的所有文件,列出文件名中包含目标内容的结果(结果为当前目录的相对路径)

$ fd Hello

dir1/Hello.java

java/Hello.java

3.2 包含隐藏目录

选项-H--hidden

$ fd -H Hello

.hg/HelloDjango.md

.hg/HelloRust.md

.hg/HelloVue.md

.hg/HelloZooKeeper.md

dir1/Hello.java

java/Hello.java

3.3 大小写

默认fd是匹配智能大小写的,如果你搜索的内容是包含大写会按照大小写精确匹配,但如果是小写会忽略大小写匹配,所以fd另外提供了两种选项来严格控制大小写匹配

选项-i--ignore-case忽略大小写。

$ fd -i Hello

dir1/Hello.java

hello_fd.md

hello_java.md

java/Hello.java

选项-s--case-sensitive严格匹配大小写。

$ fd -s hello

hello_fd.md

hello_java.md

3.4 返回绝对路径

选项-a--absolute-path

$ fd -a Hello

/Users/junjiexun/fd_test/dir1/Hello.java

/Users/junjiexun/fd_test/java/Hello.java

3.5 返回文件列表详情

选项-l--list-details获得类似ls -l的效果。

$fd-lhello-rw-r--r--1junjiexunstaff0B3118:42dir1/Hello.java-rw-r--r--1junjiexunstaff0B3118:37hello_fd.md-rw-r--r--1junjiexunstaff0B3118:37hello_java.md-rw-r--r--1junjiexunstaff0B3118:38java/Hello.java

3.6 搜索内容包含路径

选项-p--full-path不单单搜索文件名,还列出目录中包含目标内容的结果。

因为这个测试的目录就在/Users/junjiexun下面,所以这样搜索相当于全部的文件都会被搜索出来。

$ fd xunNothingreturn...

$ fd -p xun

dir1

dir1/Hello.java

dir1/World.java

dir1/dir2

...(略)

3.7 包括 .gitignore 里的文件

选项-I--no-ignore我这里新建了一个.gitignore文件内容只有一个*.java用来演示,并且需要把当前目录通过git init初始化成 git 的项目。

不加该参数,可以看到结果集中.java的文件都被过滤了。

$ fd java

hello_java.md

java

my_java.txt

加上了-I之后结果中又包括了.java结尾的文件了。

$ fd -I java

dir1/Hello.java

dir1/World.java

hello_java.md

java

java/Hello.java

java/World.java

my_java.txt

-I功能我演示完了,为了之后的演示,我将.gitignore.git目录给删除了。

这些简单的功能已经可以满足一半的日常搜索需求了,接下来我们看看fd提供的更高级的搜索选项吧!

四、高级搜索选项

4.1 按深度

选项-d--max-depth ,当前路径算深度 1,dir3下面的rs文件就是深度 4 了。

$ fd rs

dir1/dir2/dir3/fd_demo.rs

dir1/dir2/dir3/fd_help.rs

rust/fd_demo.rs

rust/fd_help.rs
$ fd -d3rs

rust/fd_demo.rs

rust/fd_help.rs

4.2 按文件类型

选项-t--type fd提供了以下几种filetype选项:

  • f:file
  • d:directory
  • l:symlink
  • x:executable
  • e:empty
  • s:socket
  • p:pipe
$ fd -t l

softdir3

sss.py
$ fd -t d

dir1

dir1/dir2

dir1/dir2/dir3

java

python

rust

我给所有的 py 文件都加了可执行权限

$ fd -t x

python/demo.py

python/demo1.py

python/sss.py

4.3 按扩展名

选项-e--extension

$ fd -e md

hello_fd.md

hello_java.md

4.4 排除

选项-E--exclude 支持通配符,排除所有包含字母s的结果。

$ fd -E*s*dir1

dir1/Hello.java

dir1/World.java

dir1/dir2

dir1/dir2/demo.py

dir1/dir2/demo1.py

dir1/dir2/dir3

hello_fd.md

hello_java.md

java

java/Hello.java

java/World.java

my_java.txt

python

python/demo.py

python/demo1.py

可以看到所有的 rust、rs、sss、soft 都没有出现在结果集中。

4.5 按所有者

选项-o--owner

$fd-l-ojunjiexundrwxr-xr-x5junjiexunstaff160B3118:42dir1-rw-r--r--1junjiexunstaff0B3118:42dir1/Hello.java-rw-r--r--1junjiexunstaff0B3118:42dir1/World.javadrwxr-xr-x6junjiexunstaff192B3118:42dir1/dir2-rw-r--r--1junjiexunstaff0B3118:42dir1/dir2/demo.py...(略)

或者fd -l -o junjiexun:staff也可以达到同样的效果,但是fd不支持单独搜索 group,也不支持通配符,如果你有想法的话可以给他提 issue 哦~

4.6 组合命令

fd提供了-x--exec -X--exec-batch 来进行对搜索结果集的进一步处理

找到所有和 java 匹配的内容并且删除!(仅仅用做演示,rm -rf慎用)

$ fd java -X rm -rf

找到所有的 py 并且通过 vim 打开

$ fd py -X vim

还可以使用诸如unziplsconvert等等其他常用的命令,也可以直接使用 *unix 语法|管道符语法进一步处理。

4.7 正则表达式

对于文件的内容搜索,我之前演示的是诸如 Hello、java、py 都是这样的完整文本,实际fd默认就是支持正则表达式对内容进行搜索的,但是正则表达式需要使用单引号包裹起来,我下面演示:将所有 s 开头的文件都能被搜索出来。

$ fd^s.*dir1/dir2/sss.py

python/sss.py

softdir3

sss.py

如果你不想使用正则表达式,想换成更简单的通配符匹配的话就可以使用选项-g--glob可以达到同样的效果。

$ fd -gs*dir1/dir2/sss.py

python/sss.py

softdir3

sss.py

上面的选项大部分都是可以同时使用的,篇幅有限我这里就不继续演示了。

五、总结

fd是一个简单友好的命令行文件搜索工具,而且其开源的属性作为 Rust 源码学习的对象也是非常优秀的,赶紧学起来!觉得本文还不错的话,转评赞走一波!

相关文章

评论列表

发表评论:
验证码

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。