你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

Linux下自己也可以动手实现一个轻巧的 everything

[复制链接]
gaosmile 发布时间:2020-5-5 22:49
我们知道,在 Windows 下,有一款非常实用的神器,叫作 Everything ,它可以在极短的时间里,搜索出来你所想要的文件/目录,如下图示:
微信图片_20200505224523.gif ; m  w7 C, Y) K. m8 L5 w
7 H' Q5 f! M/ m# @0 ?! ]2 R) o
; J6 d. g" R# L; _* @* \9 a
Linux 下也有一些类似于 everything 的神器,比如:locate,Catfish,Tracker,等等。这些工具也十分强大,在此就不一一演示了,有兴趣的小伙伴可以自行去体验一下。

8 c2 }: Y0 p+ N4 t  F9 P
但是,其实我们自己也可以动手实现一个轻巧的 everything ,既可以满足自己的需求,也可以提高自己的技术,还能在程序媛面前秀一把~
废话不多说,我们直接上脚本:

. D' F+ G( b+ `5 s1 S
#!/bin/sh
' d' N2 E3 ]( x. Z! D# lazy find+ U3 X8 x0 X. |
0 U' c3 _9 o5 t0 y! h+ @2 \3 ~
# GNU All-Permissive License
4 _: O* R: M7 \3 Q# Copying and distribution of this file, with or without modification,
1 t8 J) J4 Q! I7 A0 Z# 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,
& G9 C/ \! q+ H8 G! W! M8 K# without any warranty.
# ^* {7 r! f  j" |0 q& M' s0 f6 ^) r' I8 t3 Q3 ^# V6 E7 ]. R
## help function$ t" j. g+ _# E" U2 p  `, m9 m3 _. _

3 @/ b3 E/ D" m% F; w) Zfunction helpu {) p/ @6 x* @& Z, J$ f
    echo " ". b' @1 g, [0 ?  A/ N. }
    echo "Fuzzy search for filename."
- C" Z% @$ N% v* V& L/ F- O    echo "$0 [--match-case|--path] filename"
# Y8 R7 A3 z( I* g    echo " "/ n" n6 e8 n+ n
    exit
) _" P5 Y: ?  ~- ~% p+ b}4 P3 a" Y4 P3 H: }4 ~

( G" e& C! b1 |## set variables% ~# ]: N7 n) u5 }2 K$ c* f# D
* E+ z/ a* K) X( t- ?% V# F8 m) Q+ e
MATCH="-iname"
( B0 d# T" u) i* o( m2 b9 c% TSEARCH="."
$ ^* p  c6 h, \: R/ V& i; y
5 H% R5 e: S7 ]6 Y## parse options
  B# \6 ~' W1 N! 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
6 w: ^/ S/ v$ p$ n1 ?# P1 L    helpu0 f% @* w  o! m. ^7 D! \) D' i" T1 T
elif [ "$1" = "--match-case" -o "$1" = "-m" ]; then
( W1 c5 P4 J+ V    MATCH="-name"
& O) r& A$ @" @: X    shift 1
, W) l  {" C8 ~$ I. r' helif [ "$1" = "--path" -o "$1" = "-p" ]; then$ G9 W1 N8 L5 P0 S5 ]& r8 B! S
    SEARCH="${2}"
* W4 [8 r4 S) M0 S5 ~% `    shift 2- y- W  [5 }& r' q6 Z5 J8 X
else  K7 E: q- B. B
    break
$ k% V8 t3 V' dfi! 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
  p* R' \4 s! n' }/ Q* @## create array, retain spaces) f4 t2 P) w& w$ `
0 h# S% }' _9 n' y8 b. Y0 W* l
ARG=( "${@}" )
- d3 R9 o* m2 M; x3 Uset -e2 A% G! N7 h5 C" J  v5 X# O- p

1 o# T$ j: }8 c) x+ y+ p/ U! P6 M% f## catch obvious input error
3 o7 s$ F: e& l$ }  N4 A. D( h) w: T) b# U  I( V) K
if [ "X$ARG" = "X" ]; then
2 l/ s$ M1 J9 f& G+ J$ I    helpu
, R0 [# R* a2 G: J! mfi/ |' x- \8 d" E; t3 i) N
& ^6 F9 \0 p# T5 }
## perform search
) ~; W2 g, p& I  J2 W$ v: w2 A: H7 B/ }, S
for query in ${ARG
}; do9 _+ E7 Y# O" U) w
    /usr/bin/find "${SEARCH}" "${MATCH}" "*${ARG}*"
" S9 o# s: d4 F! `( n# \1 B- g* g
done
& \4 B: R' _* G% h& g) f: Q9 e( ]# R- o8 ]% O6 f5 _
/ m7 H: [, `7 R7 S$ r: G1 G; S# ~
这段脚本不是良许的原创,而是国外一个小哥的作品。这个脚本写得还是非常简洁,并且使用了一些常用的 Shell 编程技术,好好去研究它也会提高自己的 Shell 编程水平。

  c( {  u) L9 ?
那么这个脚本怎么用?

" m- S* z7 t! h# K
第一步,创建一个脚本文件。
9 `5 d" k. }' }5 S0 L1 _5 `+ G7 P

: x8 j9 R: E) d( \! |
比如创建的脚本文件是 lazy_find.sh 。
$ vim lazy_find.sh
" i# z4 z8 J! k' T. |
- q. k# a" p# b7 H
然后,我们再把上面的脚本内容复制进去,再按 :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+ |
第二步,使用脚本搜索文件。
! e2 I# Q$ X3 p9 i; Y
, d8 H3 [9 c' ]0 l$ G
+ n& g8 a: x3 z8 N. r
最基本的用法,就是在脚本名称后面直接跟上要搜索的文件名称。不需要跟上完整的名称,只需要其中一部分就好,比如:
$ ./lazy_find.sh scr
0 b! {" R! Z# }% J# C+ ?- A! h( M( ?" @! ^: b  w5 |
运行结果如下:
微信图片_20200505224531.jpg . }8 Z) k* ]$ W0 y4 K$ M# g5 P

& b% Z* }* r( b* D2 x8 m

# x% K# ~' j0 ~3 ]) |) O
可以看到,这个脚本不仅可以搜索当前路径下的文件,还可以搜索当前目录下的子目录及孙目录,也就是具有递归搜索的功能。
; 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
0 @4 [5 h$ R0 O' S. b( e
1 j2 [: `* M- _" J+ _
运行结果如下:
微信图片_20200505224535.jpg
5 w1 K7 g( d* Y. j% [
% t; c8 q1 k3 W

! d  T3 `" i. p' _* q- p5 Y
可以看到,Scr 已经没有再被匹配到了。
4 w; \+ a% _8 Y! @1 w! v
如果我们不想搜索当前目录,而是想要搜索指定目录,则只需加上 --path ,并指定想要搜索的路径即可。
* A9 Z8 B' L! J) K1 W+ ?
比如,我们想在家目录下搜索包含有 hello 关键字的文件/目录,可以这么运行命令:
$ ./lazy_find.sh --path ~ hello
3 k; O+ l1 g' m+ t& U) |  c4 _, J3 ~9 ~% P- {+ ~
运行结果如下:
微信图片_20200505224538.jpg + D$ j8 R4 M* a6 X5 U1 g

& t2 l/ [0 \7 U9 A
4 c: L( e6 t. Q% b' Z% U, |/ T2 i
第三步,自定义命令调用脚本4 R) M$ D/ X" l6 y$ o: I

* W) O9 N$ J/ d2 Q6 R. V% ?
: Z/ _  y' f" L$ L
在上面的使用方法中,我们需要自己手动去运行那个脚本文件,这样肯定是非常不方便的。我们可以自定义一个命令,比如 lf ,当运行这个命令时,就自动调用这个脚本,从而大大提高效率。

% ~$ E0 q2 x* b$ e# B+ \- S
有 Linux 基础的小伙伴应该想到了,我们可以使用 alias 命令来实现这个效果。为了能够在系统重启之后 lf 命令依然能使用,我们直接在 .bashrc 里进行修改。
$ vim ~/.bashrc
" J3 f/ A" ~3 R$ q% j6 w3 i- |% x& |, D
在 .bashrc 文件的末尾增加这么一行语句即可:
alias lf=~/bin/lazy_find.sh #路径别照抄,写你自己的脚本路径!!7 q% y  Y( q, A  A5 \' {

3 F1 p/ \2 D7 E2 d3 m4 h3 Z. k9 U1 Z
增加完语句之后,按 :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
微信图片_20200505224724.jpg 6 K! Y8 g- l# m6 ^2 ]& N
; H3 N+ B8 A8 i# l- a. @
6 [" p3 Z3 {+ `
小结  D/ Q# W% r0 V* P5 _

( d: H' W' S- u. ^0 S3 f0 q( S
- \8 }6 g, Y  L( m5 Q  k" V
本文我们通过一段脚本来实现 everything 的一些基本功能,通过学习这个脚本,我们可以提高自己的 Shell 编程能力,同时也可以学会如何自定义命令来调用自己写的脚本。
本文比较基础,适合小白入门。

" b3 F: Y) c. ]3 a- u
赞 收藏 评论0 发布时间:2020-5-5 22:49

举报

0个回答

所属标签

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版