自己动手在Linux系统实现一个everything程序
大家好,我是良许。
我们知道,在 Windows 下,有一款非常实用的神器,叫作 Everything ,它可以在极短的时间里,搜索出来你所想要的文件/目录,如下图示:
Linux 下也有一些类似于 everything 的神器,比如:locate,Catfish,Tracker,等等。这些工具也十分强大,在此就不一一演示了,有兴趣的小伙伴可以自行去体验一下。
但是,其实我们自己也可以动手实现一个轻巧的 everything ,既可以满足自己的需求,也可以提高自己的技术,还能在程序媛面前秀一把~
废话不多说,我们直接上脚本:
!/bin/sh
lazy find
GNU All-Permissive License
Copying and distribution of this file, with or without modification,
are permitted in any medium without royalty provided the copyright
notice and this notice are preserved. This file is offered as-is,
without any warranty.
help function
function helpu {
echo " "
echo "Fuzzy search for filename."
echo "$0 [--match-case|--path] filename"
echo " "
exit
}
set variables
MATCH="-iname"
SEARCH="."
parse options
while [ True ]; do
if [ "$1" = "--help" -o "$1" = "-h" ]; then
helpu
elif [ "$1" = "--match-case" -o "$1" = "-m" ]; then
MATCH="-name"
shift 1
elif [ "$1" = "--path" -o "$1" = "-p" ]; then
SEARCH="${2}"
shift 2
else
break
fi
done
sanitize input filenames
create array, retain spaces
ARG=( "${@}" )
set -e
catch obvious input error
if [ "X$ARG" = "X" ]; then
helpu
fi
perform search
for query in ${ARG[*]}; do
/usr/bin/find "${SEARCH}" "${MATCH}" "*${ARG}*"
done
这段脚本不是良许的原创,而是国外一个小哥的作品。这个脚本写得还是非常简洁,并且使用了一些常用的 Shell 编程技术,好好去研究它也会提高自己的 Shell 编程水平。
那么这个脚本怎么用?
2020 精选 阿里/腾讯等一线大厂 面试、简历、进阶、电子书 公众号「良许Linux」后台回复「资料」免费获取
第一步,创建一个脚本文件。
比如创建的脚本文件是 lazy_find.sh 。
$ vim lazy_find.sh
然后,我们再把上面的脚本内容复制进去,再按 :wq 保存并退出。
接着,我们再用 chmod 命令赋予这个脚本可执行权限:
$ chmod +x lazy_find.sh
第二步,使用脚本搜索文件。
最基本的用法,就是在脚本名称后面直接跟上要搜索的文件名称。不需要跟上完整的名称,只需要其中一部分就好,比如:
$ ./lazy_find.sh scr
运行结果如下:
可以看到,这个脚本不仅可以搜索当前路径下的文件,还可以搜索当前目录下的子目录及孙目录,也就是具有递归搜索的功能。
上面这种用法是不匹配大小写的效果,也就是说,既可以匹配到 scr ,也可以匹配到 Scr 。那么,如果想要区分大小写,需要怎么做?
只需加上 -m 选项即可。
$ ./lazy_find.sh -m scr
运行结果如下:
可以看到,Scr 已经没有再被匹配到了。
如果我们不想搜索当前目录,而是想要搜索指定目录,则只需加上 --path ,并指定想要搜索的路径即可。
比如,我们想在家目录下搜索包含有 hello 关键字的文件/目录,可以这么运行命令:
$ ./lazy_find.sh --path ~ hello
运行结果如下:
2020 精选 阿里/腾讯等一线大厂 面试、简历、进阶、电子书 公众号「良许Linux」后台回复「资料」免费获取
第三步,自定义命令调用脚本
在上面的使用方法中,我们需要自己手动去运行那个脚本文件,这样肯定是非常不方便的。我们可以自定义一个命令,比如 lf ,当运行这个命令时,就自动调用这个脚本,从而大大提高效率。
有 Linux 基础的小伙伴应该想到了,我们可以使用 alias 命令来实现这个效果。为了能够在系统重启之后 lf 命令依然能使用,我们直接在 .bashrc 里进行修改。
$ vim ~/.bashrc
在 .bashrc 文件的末尾增加这么一行语句即可:
alias lf=~/bin/lazy_find.sh #路径别照抄,写你自己的脚本路径!!
增加完语句之后,按 :wq 保存并退出。然后,再使能我们的修改:
$ . ~/.bashrc
OK,大功告成了,我们在任意地方都可以使用这个命令了。
小结
本文我们通过一段脚本来实现 everything 的一些基本功能,通过学习这个脚本,我们可以提高自己的 Shell 编程能力,同时也可以学会如何自定义命令来调用自己写的脚本。
本文比较基础,适合小白入门。