|
我们知道,在 Windows 下,有一款非常实用的神器,叫作 Everything ,它可以在极短的时间里,搜索出来你所想要的文件/目录,如下图示:
7 H' Q5 f! M/ m# @0 ?! ]2 R) o ; J6 d. g" R# L; _* @* \9 a Linux 下也有一些类似于 everything 的神器,比如:locate,Catfish,Tracker,等等。这些工具也十分强大,在此就不一一演示了,有兴趣的小伙伴可以自行去体验一下。 但是,其实我们自己也可以动手实现一个轻巧的 everything ,既可以满足自己的需求,也可以提高自己的技术,还能在程序媛面前秀一把~ 废话不多说,我们直接上脚本: # lazy find+ U3 X8 x0 X. | 0 U' c3 _9 o5 t0 y! h+ @2 \3 ~ # GNU All-Permissive License # Copying and distribution of this file, with or without modification, # are permitted in any medium without royalty provided the copyright. ] z/ M5 s; s # notice and this notice are preserved. This file is offered as-is, # without any warranty. 0 f6 ^) r' I8 t3 Q3 ^# V6 E7 ]. R ## help function$ t" j. g+ _# E" U2 p `, m9 m3 _. _ function helpu {) p/ @6 x* @& Z, J$ f echo " ". b' @1 g, [0 ? A/ N. } echo "Fuzzy search for filename." echo "$0 [--match-case|--path] filename" echo " "/ n" n6 e8 n+ n exit }4 P3 a" Y4 P3 H: }4 ~ ## set variables% ~# ]: N7 n) u5 }2 K$ c* f# D * E+ z/ a* K) X( t- ?% V# F8 m) Q+ e MATCH="-iname" SEARCH="." ## parse options ! i( z$ I" F& Q; ~" e) Y1 ]7 ^! k, g while [ True ]; do) m) v1 g& P, c% \7 Y# q: `9 ~; j if [ "$1" = "--help" -o "$1" = "-h" ]; then helpu0 f% @* w o! m. ^7 D! \) D' i" T1 T elif [ "$1" = "--match-case" -o "$1" = "-m" ]; then MATCH="-name" shift 1 elif [ "$1" = "--path" -o "$1" = "-p" ]; then$ G9 W1 N8 L5 P0 S5 ]& r8 B! S SEARCH="${2}" shift 2- y- W [5 }& r' q6 Z5 J8 X else K7 E: q- B. B break fi! l0 S& b" E" j1 j( y+ O2 y done) H4 g( a5 t2 |% D! |- e6 g / u7 w; w3 w& r1 k ## sanitize input filenames ## create array, retain spaces) f4 t2 P) w& w$ ` 0 h# S% }' _9 n' y8 b. Y0 W* l ARG=( "${@}" ) set -e2 A% G! N7 h5 C" J v5 X# O- p ## catch obvious input error ( h) w: T) b# U I( V) K if [ "X$ARG" = "X" ]; then helpu fi/ |' x- \8 d" E; t3 i) N & ^6 F9 \0 p# T5 } ## perform search $ v: w2 A: H7 B/ }, S for query in ${ARG}; do9 _+ E7 Y# O" U) w /usr/bin/find "${SEARCH}" "${MATCH}" "*${ARG}*" done : Q9 e( ]# R- o8 ]% O6 f5 _ / m7 H: [, `7 R7 S$ r: G1 G; S# ~ 这段脚本不是良许的原创,而是国外一个小哥的作品。这个脚本写得还是非常简洁,并且使用了一些常用的 Shell 编程技术,好好去研究它也会提高自己的 Shell 编程水平。 那么这个脚本怎么用? 5 S0 L1 _5 `+ G7 P 比如创建的脚本文件是 lazy_find.sh 。 $ vim lazy_find.sh然后,我们再把上面的脚本内容复制进去,再按 :wq 保存并退出。 % S9 ?6 R2 ]2 n( m! Q4 ^ 接着,我们再用 chmod 命令赋予这个脚本可执行权限: $ chmod +x lazy_find.sh; k) t# k- ~; r' Y* h* x* w* X0 H! U7 e% Y ' X5 w* S, o% ^5 G+ | 第二步,使用脚本搜索文件。 + n& g8 a: x3 z8 N. r 最基本的用法,就是在脚本名称后面直接跟上要搜索的文件名称。不需要跟上完整的名称,只需要其中一部分就好,比如: $ ./lazy_find.sh scr- A! h( M( ?" @! ^: b w5 | 运行结果如下:
可以看到,这个脚本不仅可以搜索当前路径下的文件,还可以搜索当前目录下的子目录及孙目录,也就是具有递归搜索的功能。 ; X+ [8 I% r& _8 N$ H1 E2 L$ W 上面这种用法是不匹配大小写的效果,也就是说,既可以匹配到 scr ,也可以匹配到 Scr 。那么,如果想要区分大小写,需要怎么做? 只需加上 -m 选项即可。4 B9 s" Q2 a; ]5 v) T $ ./lazy_find.sh -m scr运行结果如下:
可以看到,Scr 已经没有再被匹配到了。 4 w; \+ a% _8 Y! @1 w! v 如果我们不想搜索当前目录,而是想要搜索指定目录,则只需加上 --path ,并指定想要搜索的路径即可。 * A9 Z8 B' L! J) K1 W+ ? 比如,我们想在家目录下搜索包含有 hello 关键字的文件/目录,可以这么运行命令: $ ./lazy_find.sh --path ~ hello& U) | c4 _, J3 ~9 ~% P- {+ ~ 运行结果如下:
4 c: L( e6 t. Q% b' Z% U, |/ T2 i 第三步,自定义命令调用脚本4 R) M$ D/ X" l6 y$ o: I : Z/ _ y' f" L$ L 在上面的使用方法中,我们需要自己手动去运行那个脚本文件,这样肯定是非常不方便的。我们可以自定义一个命令,比如 lf ,当运行这个命令时,就自动调用这个脚本,从而大大提高效率。 有 Linux 基础的小伙伴应该想到了,我们可以使用 alias 命令来实现这个效果。为了能够在系统重启之后 lf 命令依然能使用,我们直接在 .bashrc 里进行修改。 $ vim ~/.bashrc% j6 w3 i- |% x& |, D 在 .bashrc 文件的末尾增加这么一行语句即可: alias lf=~/bin/lazy_find.sh #路径别照抄,写你自己的脚本路径!!7 q% y Y( q, A A5 \' {增加完语句之后,按 :wq 保存并退出。然后,再使能我们的修改: $ . ~/.bashrc. Y( v% X/ \9 E* n) q$ r0 r# c0 k& @+ A# w5 M, i# g: a1 G; R OK,大功告成了,我们在任意地方都可以使用这个命令了。 & ]2 }/ r9 }" i+ B: S( k* X
; H3 N+ B8 A8 i# l- a. @ 6 [" p3 Z3 {+ ` 小结 D/ Q# W% r0 V* P5 _ - \8 }6 g, Y L( m5 Q k" V 本文我们通过一段脚本来实现 everything 的一些基本功能,通过学习这个脚本,我们可以提高自己的 Shell 编程能力,同时也可以学会如何自定义命令来调用自己写的脚本。 本文比较基础,适合小白入门。 |
微信公众号
手机版