一款開源的文件搜索神器,終于不用記 find 命令了

作者:HelloGitHub-老荀
這是 HelloGitHub 推出的《講解開源項(xiàng)目》系列,用一篇文章帶你快速上手有趣的開源項(xiàng)目。
今天給大家推薦一個(gè)好用+開源的文件搜索工具:

fd 支持大多數(shù)主流操作系統(tǒng),快來更新你的工具箱感受開源項(xiàng)目帶來的便利吧!
一、fd 簡介
你還在為尋找文件而煩惱嗎?你還在為記不住 find 一大堆參數(shù)而煩惱嗎?那就趕快來看看我這次推薦的項(xiàng)目 fd 吧!
項(xiàng)目地址:https://github.com/sharkdp/fd
官方簡介:A simple, fast and user-friendly alternative to 'find'
我這里先放一個(gè)圖,讓大家直觀地感受下

fd 是一個(gè)命令行工具,提供了多種方便的選項(xiàng)進(jìn)行文件的搜索,而且默認(rèn)是彩色輸出。項(xiàng)目本身是由 Rust 語言編寫的,作為系統(tǒng)級編程語言 Rust 擁有媲美 C++ 的運(yùn)行速度,那 fd 的速度自然也不在話下,更優(yōu)秀的是,它提供了強(qiáng)大功能方便用戶按照各種條件進(jìn)行搜索。

這個(gè)優(yōu)秀的項(xiàng)目是不是成功地引起了你的注意呢~
二、fd 如何安裝
作為使用的第一步當(dāng)然是要先安裝啦~
fd 提供了各個(gè)操作系統(tǒng)平臺的安裝方式,再不濟(jì)可以直接通過源碼進(jìn)行安裝(前提是有 Rust 的環(huán)境噢)
2.1 一鍵安裝
我這里以我本地的 Mac 使用 brew 為例
$?brew?install?fd
brew 也可以一鍵升級
$?brew?upgrade?fd
具體到各個(gè)平臺的詳細(xì)安裝方法,你可以看這里 安裝文檔
2.2 源碼安裝
$?git?clone?https://github.com/sharkdp/fd.git
$?cd?fd
$?cargo?install?--path?.
2.3 查看幫助
無論哪種方式安裝完成后,就可以直接使用了 -h 或 --help 獲取幫助了,--help 就不演示了,區(qū)別就是換成了詳細(xì)的幫助說明,如果你以后忘記了某一個(gè)參數(shù)也記得使用 --help 來查看哦~
$?fd?-h
fd?8.2.1
USAGE:
????fd?[FLAGS/OPTIONS]?[]?[...]
FLAGS:
????-H,?--hidden????????????搜索隱藏的文件和目錄
????-I,?--no-ignore?????????不要忽略?.(git?|?fd)ignore?文件匹配
????????--no-ignore-vcs?????不要忽略.gitignore文件的匹配
????-s,?--case-sensitive ???區(qū)分大小寫的搜索(默認(rèn)值:智能案例)
????-i, --ignore-case ??????不區(qū)分大小寫的搜索(默認(rèn)值:智能案例)
????-F,?--fixed-strings?????將模式視為文字字符串
????-a,?--absolute-path?????顯示絕對路徑而不是相對路徑
????-L,?--follow????????????遵循符號鏈接
????-p, --full-path ????????搜索完整路徑(默認(rèn)值:僅限 file-/dirname)
????-0,?--print0????????????用null字符分隔結(jié)果
????-h,?--help??????????????打印幫助信息
????-V,?--version???????????打印版本信息
OPTIONS:
????-d, --max-depth ????????設(shè)置最大搜索深度(默認(rèn)值:無)
????-t,?--type?... ??????按類型過濾:文件(f),目錄(d),符號鏈接(l),
???????????????????????????????????可執(zhí)行(x),空(e)
????-e,?--extension?...???????按文件擴(kuò)展名過濾
????-x,?--exec????????????????為每個(gè)搜索結(jié)果執(zhí)行命令
????-E,?--exclude?...?????排除與給定glob模式匹配的條目
????????--ignore-file?...????以.gitignore格式添加自定義忽略文件
????-c, --color ?????????????何時(shí)使用顏色:never,*auto*, always
????-j,?--threads?????????????設(shè)置用于搜索和執(zhí)行的線程數(shù)
????-S, --size ... ??????????根據(jù)文件大小限制結(jié)果。
...
三、fd 快速上手演示
為了能讓之后的演示有一個(gè)統(tǒng)一的認(rèn)識,我這里新建了一個(gè)目錄作為 fd 的測試目錄,我虛構(gòu)了一些文件和目錄來模擬實(shí)際情況,包括一個(gè)隱藏目錄,我之后的演示都會基于該根目錄下,選項(xiàng)如果有短名稱和長名稱,示例中以短名稱為例。
該目錄大致是這樣:
.
├──?.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 直接跟想要搜索的內(nèi)容,會遞歸搜索當(dāng)前目錄下的所有文件,列出文件名中包含目標(biāo)內(nèi)容的結(jié)果(結(jié)果為當(dāng)前目錄的相對路徑)
$?fd?Hello
dir1/Hello.java
java/Hello.java
3.2 包含隱藏目錄
選項(xiàng) -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 大小寫
默認(rèn) fd 是匹配智能大小寫的,如果你搜索的內(nèi)容是包含大寫會按照大小寫精確匹配,但如果是小寫會忽略大小寫匹配,所以 fd 另外提供了兩種選項(xiàng)來嚴(yán)格控制大小寫匹配
選項(xiàng) -i 或 --ignore-case 忽略大小寫。
$?fd?-i?Hello
dir1/Hello.java
hello_fd.md
hello_java.md
java/Hello.java
選項(xiàng) -s 或 --case-sensitive 嚴(yán)格匹配大小寫。
$?fd?-s?hello
hello_fd.md
hello_java.md
3.4 返回絕對路徑
選項(xiàng) -a 或 --absolute-path:
$?fd?-a?Hello
/Users/junjiexun/fd_test/dir1/Hello.java
/Users/junjiexun/fd_test/java/Hello.java
3.5 返回文件列表詳情
選項(xiàng) -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.java
3.6 搜索內(nèi)容包含路徑
選項(xiàng) -p 或 --full-path 不單單搜索文件名,還列出目錄中包含目標(biāo)內(nèi)容的結(jié)果。
因?yàn)檫@個(gè)測試的目錄就在 /Users/junjiexun 下面,所以這樣搜索相當(dāng)于全部的文件都會被搜索出來。
$?fd?xun
Nothing?return...
$?fd?-p?xun
dir1
dir1/Hello.java
dir1/World.java
dir1/dir2
...(略)
3.7 包括 .gitignore 里的文件
選項(xiàng) -I 或 --no-ignore 我這里新建了一個(gè) .gitignore 文件內(nèi)容只有一個(gè) *.java 用來演示,并且需要把當(dāng)前目錄通過 git init 初始化成 git 的項(xiàng)目。
不加該參數(shù),可以看到結(jié)果集中 .java 的文件都被過濾了。
$?fd?java
hello_java.md
java
my_java.txt
加上了 -I 之后結(jié)果中又包括了 .java 結(jié)尾的文件了。
$?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 目錄給刪除了。
這些簡單的功能已經(jīng)可以滿足一半的日常搜索需求了,接下來我們看看 fd 提供的更高級的搜索選項(xiàng)吧!

四、高級搜索選項(xiàng)
4.1 按深度
選項(xiàng) -d 或 --max-depth ,當(dāng)前路徑算深度 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?-d?3?rs
rust/fd_demo.rs
rust/fd_help.rs
4.2 按文件類型
選項(xiàng) -t 或 --type ,fd 提供了以下幾種 filetype 選項(xiàng):
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 文件都加了可執(zhí)行權(quán)限
$?fd?-t?x
python/demo.py
python/demo1.py
python/sss.py
4.3 按擴(kuò)展名
選項(xiàng) -e 或 --extension
$?fd?-e?md
hello_fd.md
hello_java.md
4.4 排除
選項(xiàng) -E 或 --exclude 支持通配符,排除所有包含字母 s 的結(jié)果。
$?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 都沒有出現(xiàn)在結(jié)果集中。
4.5 按所有者
選項(xiàng) -o 或 --owner
$?fd?-l?-o?junjiexun
drwxr-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.java
drwxr-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 也可以達(dá)到同樣的效果,但是 fd 不支持單獨(dú)搜索 group,也不支持通配符,如果你有想法的話可以給他提 issue 哦~
4.6 組合命令
fd 提供了 -x 或 --exec 、-X 或 --exec-batch 來進(jìn)行對搜索結(jié)果集的進(jìn)一步處理
找到所有和 java 匹配的內(nèi)容并且刪除?。▋H僅用做演示,rm -rf 慎用)
$?fd?java?-X?rm?-rf
找到所有的 py 并且通過 vim 打開
$?fd?py?-X?vim
還可以使用諸如 unzip、ls、convert 等等其他常用的命令,也可以直接使用 *unix 語法 | 管道符語法進(jìn)一步處理。
4.7 正則表達(dá)式
對于文件的內(nèi)容搜索,我之前演示的是諸如 Hello、java、py 都是這樣的完整文本,實(shí)際 fd 默認(rèn)就是支持正則表達(dá)式對內(nèi)容進(jìn)行搜索的,但是正則表達(dá)式需要使用單引號 ' 包裹起來,我下面演示:將所有 s 開頭的文件都能被搜索出來。
$?fd?'^s.*'
dir1/dir2/sss.py
python/sss.py
softdir3
sss.py
如果你不想使用正則表達(dá)式,想換成更簡單的通配符匹配的話就可以使用選項(xiàng) -g 或 --glob 可以達(dá)到同樣的效果。
$?fd?-g?'s*'
dir1/dir2/sss.py
python/sss.py
softdir3
sss.py
上面的選項(xiàng)大部分都是可以同時(shí)使用的,篇幅有限我這里就不繼續(xù)演示了。
五、總結(jié)
fd 是一個(gè)簡單友好的命令行文件搜索工具,而且其開源的屬性作為 Rust 源碼學(xué)習(xí)的對象也是非常優(yōu)秀的,趕緊學(xué)起來吧!
本文源碼:https://github.com/HelloGitHub-Team/Article
如果你也對開源項(xiàng)目感興趣,希望自己的文章或項(xiàng)目被更多人喜歡,點(diǎn)擊{閱讀原文}加入《講解開源項(xiàng)目》讓我們一起分享有趣、入門級的開源項(xiàng)目吧!
?? 關(guān)注「HelloGitHub」第一時(shí)間收到更新??
