一款开源的文件搜索神器,终于不用记 find 命令了
作者:HelloGitHub-老荀
這是 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?-h fd?8.2.1USAGE:fd?[FLAGS/OPTIONS]?[<pattern>]?[<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 <depth>????????設置最大搜索深度(默認值:無)-t,?--type?<filetype>... ??????按類型過濾:文件(f),目錄(d),符號鏈接(l),可執行(x),空(e)-e,?--extension?<ext>...???????按文件擴展名過濾-x,?--exec?<cmd>???????????????為每個搜索結果執行命令-E,?--exclude?<pattern>...?????排除與給定glob模式匹配的條目--ignore-file?<path>...????以.gitignore格式添加自定義忽略文件-c, --color <when>?????????????何時使用顏色:never,*auto*, always-j,?--threads?<num>????????????設置用于搜索和執行的線程數-S, --size <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.py3.1 簡單搜索
fd 直接跟想要搜索的內容,會遞歸搜索當前目錄下的所有文件,列出文件名中包含目標內容的結果(結果為當前目錄的相對路徑)
$?fd?Hello dir1/Hello.java java/Hello.java3.2 包含隱藏目錄
選項 -H 或 --hidden
$?fd?-H?Hello .hg/HelloDjango.md .hg/HelloRust.md .hg/HelloVue.md .hg/HelloZooKeeper.md dir1/Hello.java java/Hello.java3.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.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?xun Nothing?return... $?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 <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?-d?3?rs rust/fd_demo.rs rust/fd_help.rs4.2 按文件類型
選項 -t 或 --type <filetype>,fd 提供了以下幾種 filetype 選項:
f:file
d:directory
l:symlink
x:executable
e:empty
s:socket
p:pipe
我給所有的 py 文件都加了可執行權限
$?fd?-t?x python/demo.py python/demo1.py python/sss.py4.3 按擴展名
選項 -e 或 --extension <ext>
$?fd?-e?md hello_fd.md hello_java.md4.4 排除
選項 -E 或 --exclude <pattern> 支持通配符,排除所有包含字母 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 <user:group>
$?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 也可以達到同樣的效果,但是 fd 不支持單獨搜索 group,也不支持通配符,如果你有想法的話可以給他提 issue 哦~
4.6 組合命令
fd 提供了 -x 或 --exec <cmd>、-X 或 --exec-batch <cmd> 來進行對搜索結果集的進一步處理
找到所有和 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.py python/sss.py softdir3 sss.py如果你不想使用正則表達式,想換成更簡單的通配符匹配的話就可以使用選項 -g 或 --glob 可以達到同樣的效果。
$?fd?-g?'s*' dir1/dir2/sss.py python/sss.py softdir3 sss.py上面的選項大部分都是可以同時使用的,篇幅有限我這里就不繼續演示了。
五、總結
fd 是一個簡單友好的命令行文件搜索工具,而且其開源的屬性作為 Rust 源碼學習的對象也是非常優秀的,趕緊學起來吧!
本文源碼:https://github.com/HelloGitHub-Team/Article
如果你也對開源項目感興趣,希望自己的文章或項目被更多人喜歡,點擊{閱讀原文}加入《講解開源項目》讓我們一起分享有趣、入門級的開源項目吧!
👆 關注「HelloGitHub」第一時間收到更新👆
總結
以上是生活随笔為你收集整理的一款开源的文件搜索神器,终于不用记 find 命令了的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Python之dict字典
- 下一篇: 用Python Django搭建简单一个