推薦2款檔案系統中查詢檔案的工具

夢哲 發表於 2021-12-04

眾所周知,在Linux或者類Unix的檔案系統中,想通過檔名關鍵字查詢檔案,可以通過find命令。那本文將推薦2款可以快速查詢檔案的工具,效能比find命令更好,可在某些場景下替換find的使用。

mlocate

大部分的Linux發行版的都提供了 mlocate 軟體包,該軟體包包含了一個locate命令用於查詢檔案,和一個updatedb命令用於更新檔案索引供locate使用。

可直接通過系統的軟體包管理工具直接安裝

# CentOS/RHEL
$ sudo dnf install mlocate

# Debian/Ubuntu
$ sudo apt install mlocate

安裝完成後,首先需要執行以下命令進行檔案索引

sudo updatedb

索引檔案將預設存放在 /var/lib/mlocate/mlocatedb ,也可以修改配置檔案 /etc/updatedb.conf 檔案,新增某些不需要索引的資料夾,例如

# Paths which are pruned from updatedb database
PRUNEPATHS="/tmp /var/tmp /var/cache /var/lock /var/run /var/spool /mnt /cdrom /usr/tmp /proc /media /sys /.snapshots /var/run/media"

完成索引之後,就可以使用 locate <pattern> 命令進行檔案查詢了,例如

$ locate mlocate
/etc/systemd/system/timers.target.wants/mlocate.timer
/usr/bin/rpmlocate
/usr/lib/systemd/system/mlocate.service
/usr/lib/systemd/system/mlocate.timer
/usr/sbin/rcmlocate
/usr/share/doc/packages/mlocate
/usr/share/doc/packages/mlocate/AUTHORS
/usr/share/doc/packages/mlocate/ChangeLog
/usr/share/doc/packages/mlocate/NEWS
/usr/share/doc/packages/mlocate/README
/usr/share/licenses/mlocate
/usr/share/licenses/mlocate/COPYING
/usr/share/man/man5/mlocate.db.5.gz
/var/lib/mlocate
/var/lib/mlocate/mlocate.db
/var/lib/mlocate/mlocate.db.9O5YsQ
/var/lib/systemd/migrated/mlocate
/var/lib/systemd/timers/stamp-mlocate.timer

可以使用 -b 選項進行精確匹配,例如下面兩個查詢的結果區別

$ locate -b '\updatedb'
/usr/bin/updatedb

注意使用 -b 時,需要在搜尋的關鍵自前使用 \

$ locate 'updatedb'
/etc/updatedb.conf
/etc/apparmor.d/usr.bin.updatedb
/usr/bin/updatedb
/usr/share/augeas/lenses/dist/updatedb.aug
/usr/share/man/man5/updatedb.conf.5.gz
/usr/share/man/man8/updatedb.8.gz
/usr/share/nvim/runtime/ftplugin/updatedb.vim
/usr/share/nvim/runtime/syntax/updatedb.vim
/usr/share/vim/vim80/ftplugin/updatedb.vim
/usr/share/vim/vim80/syntax/updatedb.vim

還可以使用 -r 進行基本的正規表示式模式匹配查詢,可以檢視 locate --help 或者 man locate

接下來我們將介紹另一款find的替代平 - fd 。

fd

fd是一款由David Peter開發的開源工具,用於在檔案系統中查詢檔案,在大部分情況下可以替換find命令。

fd可用於多個平臺,包括大部分的Linux發行版,MacOS,Windows,具體安裝可檢視 https://github.com/sharkdp/fd...

例如可以使用 HomeBrew/LinuxBrew 進行安裝

$ brew install fd

安裝完成後,就可以直接使用,例如查詢當前資料夾下以 png 為副檔名的檔案

$ fd -e png
go/src/github.com/Go-zh/tour/static/img/gopher.png
go/src/github.com/Go-zh/tour/content/img/tree.png
go/src/github.com/containous/yaegi/doc/images/yaegi.png
...

注意,fd命令預設的搜尋路徑是當前目錄,可以使用 --base-directory 或者 --search-path 來指定搜尋路徑,例如我們查詢 /etc/ 下,匹配 docker 的常規檔案

$ fd --base-directory /etc/ -t f 'docker'
audit/rules.d/docker.rules
bash_completion.d/docker-compose.bash
sysconfig/docker

還可以使用 -x 選項將結果輸出給其他命令進行操作(類似find命令的--exec選項),例如

$ fd -d 1 -e png -x convert {} {.}.jpg

這將查詢當前目錄下的所有PNG檔案,並轉換為JPG檔案。上面的命令中使用到了佔位符 {}{.} ,看如下示例展示佔位符所代表的結果

❯ fd 'recognition.db' -x echo {}
Pictures/recognition.db
Pictures/Photos/recognition.db

❯ fd 'recognition.db' -x echo {.}
Pictures/Photos/recognition
Pictures/recognition

❯ fd 'recognition.db' -x echo {/}
recognition.db
recognition.db

❯ fd 'recognition.db' -x echo {//}
Pictures
Pictures/Photos

❯ fd 'recognition.db' -x echo {/.}
recognition
recognition

通過佔位符,可以很方便的對檔案進行相關操作。更多的fd命令選項,可以檢視 fd --help

如果想在Windows上使用fd,可以通過 Scoop 包管理器安裝,開啟PowerShell

-> scoop install fd

總結

這裡介紹了兩款在檔案系統中通過檔名匹配快速查詢檔案的工具,mlocate使用了索引檔案,所以在全域性查詢檔案時的效率很高。而fd工具提供了很多的功能,在大部分場景下可代替find命令來使用,而效能也高於find命令。補充,fd工具的開發者除了這個工具外,還開發了其他很實用的工具,例如bat - 一個可以代替cat命令的工具,其他支援很多程式語言的語法高亮的形式來輸出檔案內容,也推薦使用。

同時釋出在 Mengz's Blog