众所周知,在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
$ 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