EDA365电子论坛网

标题: 简要总结一下linux下find命令即文件查找命令的用法 [打印本页]

作者: uperrua    时间: 2019-12-9 13:56
标题: 简要总结一下linux下find命令即文件查找命令的用法
简要总结一下linux下find命令即文件查找命令的用法
! l' u! X; S5 S0 {0 s
! ]% E# {5 I& R9 r* X0 Q& I
$ x) m: f. `. l4 t前言:我们为什么要学会使用find命令?1 E3 J3 {' u* q- l& {8 A

9 W9 C. W" {4 N4 G, n每一种操作系统都有成千上万的文件组成,对于linux这样“一切皆文件”的操作系统来说更不例外,大家应该都能很轻松使用windows下的文件查找功能,但是对linux这一功能可能并不是很熟悉,其实想玩linux的你更要牢牢掌握这个命令,因为linux不像windows那样有固定的文件名后缀,并且因为linux阵营下百家争鸣的特性,一个相同的文件在不同的发行版,可能会有不同,所以如果你能牢牢掌握find命令的使用,你在摸索linux的道路上将会顺利很多,同时你会发现linux下文件查找功能其实很简单,而且要比windows下查找功能强大很多很多!好,下面进入正题
8 ~, Z4 V  _/ M6 w$ g+ d- o5 ?8 I) V8 @& ~/ m9 f
0 e, r$ R! s! c. I
Linux下查找文件的命令有两个;locate 和 find  c, M" U: n( H" i! f
% ^  j% J, P5 O: i* v
首先说下locate,locate这个命令是对其生成的数据库进行遍历(生成数据库的命令:updatedb),这一特性决定了用locate查找文件速度很快,但是locate命令只能对文件进行模糊匹配,在精确度上来说差了点,简单介绍下它的两个选项:
/ X% \, w/ b3 `
1 ]8 z* F2 y+ }  #locate ; R/ J3 l5 |) i5 W5 C
* h9 F) b1 q% \) t9 g
             -i        //查找文件的时候不区分大小写 比如:locate  –i   passwd- ?# z' ^& K1 R2 t

- E! U8 r6 _9 g- _             -n       //只显示查找结果的前N行     比如:locate  -n  5   passwd
. d$ f/ O, d+ W8 G9 R9 A
( n7 E* ?# j4 |8 Z
9 t" ?: b2 Y+ i, X2 x下面重点说下find,find在不指定查找目录的情况下是对整个系统进行遍历查找# o: D# p' @3 v. d3 U
) Q( }: g$ F; r0 n+ m$ k$ w3 A
  使用格式 :   find  [指定查找目录]  [查找规则]  [查找完后执行的action]

  N5 ~7 g9 ~0 g, e4 V- C8 _2 R4 G5 l  `6 J3 w" M7 S8 c
  [指定查找目录]例如:' @2 x# B. u& u3 V$ E

, p, X* L% A( X# c5 I# _
9 L1 L3 g# \- q0 r4 N) q
: A# N5 N; O. G
这里要注意的是目录之间要用空格分开
3 S) I% V3 l$ Y& B. b& b3 }: I# }* k
3 G) k. \9 O/ Y! ^) L  [查找规则] ) f( _) ^' H4 c  }
4 k: J, N7 |; `# Z4 S
        (1)根据文件名查找+ R: W) k3 o, \, q- s

& {5 |# G" T7 V% S) M$ r8 L           #  -name       //根据文件名查找(精确查找)3 u0 Y1 @# y5 j$ U6 x' y! X/ C9 ^1 p
9 y) l, e% V; A
           #  -iname       //根据文件名查找,但是不区分大小写 9 y+ q- h& C  T* s: x
  O- a; a; N' ?* ~
这里另外介绍下文件名通配的知识7 P2 u) U6 X- d

1 R: d0 f" ?8 [( b/ T*表示  通配任意的字符
" d- g; _  u/ j. `2 b4 _- @
+ R7 A+ m( Y3 j/ Y6 W# p

- E. R0 i( k0 u8 h, b4 z  x2 b  r
* I) Q! g# W5 x8 | ?表示  通配任意的单个字符5 G2 l  a) h2 m

' }% ]: K" A( t" l, {/ R0 }  W
4 l* B  u: J' H
        
) a4 `; |, E6 o! L/ e8 L[ ] 表示 通配括号里面的任意一个字符7 l( _" e, |& }8 W  _
6 v' e, S0 m4 M) F
; b0 {: o: `0 P: n
$ w$ [" x6 M5 R, [2 x% \
     (2),根据文件所属用户和组来查找文件
4 f4 B0 \# {( O  e+ P( b+ x$ E" H$ Q9 O% w  L$ j) ?
           #  -user         //根据属主来查找文件4 h. g8 a7 w% r# L* c

! c- h8 i( W& m           #  -group        //根据属组来查找文件. s# w' l: }, t5 P! R" b$ m

2 C9 t4 G& S( u2 D4 S8 ]          (3),根据uid 和 gid来查找用户% r5 i( ?' f2 a# F. F0 n; g9 {

4 h' V& C1 @: D4 Q           #find  /tmp  -uid  500  //查找uid是500 的文件, @/ u; E& d3 c
6 P' L0 a0 i/ M1 d
           #find  /tmp  -gid  1000 // 查找gid是1000的文件. n# V5 \1 {, y6 ~" L

& U# E# z9 K) j" P' k          (4),-a  and  -o  and  –not的使用" r4 [: K4 r% x" u1 Q
% y- v2 c* K; q/ x3 G
           # -a 连接两个不同的条件(两个条件必须同时满足)
/ d" ?* h: c: G2 P/ w; b
( J5 b7 H* @( K

# m" ~! p. V, t; h8 v% X+ _
) m% C" o, H, G2 B7 H4 X& j, q' p) f  Q& y          # -o 连接两个不同的条件(两个条件满足其一即可)/ w6 T6 Y. K2 N: F0 k
3 k1 I% M; [) W/ r* t" c" t$ z
          # -not 对条件取反的# X+ M9 ]( {! X, M# R' |% u
7 A) h. q/ Q" u. i0 C* o
      
7 ]) t; ^2 p, p  T
# A4 a3 ?& S  ]( x- h    (5),根据文件时间戳的相关属性来查找文件
7 k1 ^0 _5 J8 S$ E( @9 ~7 o
; L3 b" I3 B+ ?' R' E* F. O' S          我们可以使用stat命令来查看一个文件的时间信息 如下:7 I# ^  r' Q( z* o  R
2 z3 i6 i/ ?: X+ |: a
" {' X# ^5 P3 _8 A/ C
+ B3 j3 X; S  n3 Q/ T, b- X
      0 l$ F. ^" I) a, Y/ z+ H2 s
           #-atime
3 V" x0 a" T. z) p' r) X4 C
7 ?6 ~0 M8 h" b1 Q$ M; J           #-mtime
' d: X& @$ W  E
$ P: T% p0 R2 j# z2 n           #-ctime7 }% \/ I9 ?* ~

( t% m9 h! y: D- O3 X& }- @           #-amin
& D+ x) D* w, g5 N5 i4 C2 @
8 l' R1 I& c$ b6 e9 R! l           #-mmin3 Z( ?3 p2 q: m; K! p9 e6 H& S
8 g! a* p) F9 Q! \& `) E
           #-cmin! w: f* c, ~/ k" D2 C% H

# \& z3 s+ {( ]: ?4 B4 x6 |) i/ i6 o6 {" A; L: ~
   所以这里atime,mtime,ctime就是分别对应的“最近一次访问时间”“最近一次内容修改时间”“最近一次属性修改时间”,这里的atime的单位指的是“天”,amin的单位是分钟  
1 a+ q1 W3 f2 d4 n+ j8 O5 D7 [& u  J
          #find  /tmp  –atime  +5           //表示查找在五天内没有访问过的文件
/ _- l- k, ^4 _/ [3 s; M8 w
/ |3 w( R! A- i$ ]; h          #find  /tmp  -atime  -5            //表示查找在五天内访问过的文件, P+ _0 `7 |2 M" ?* {0 S" n! U6 e
+ G. k* l* q( r$ {9 M+ i+ ^$ S0 w6 N
         
0 J# |6 u" G6 c7 H" g% |" {          (6),根据文件类型来查找文件! A6 T) E2 a2 M# C# o" }$ x
& U/ F1 @0 F/ f/ p( C9 F
                -type
* V7 I. z5 t: k5 l! ^% b" \$ k& S
: j$ e* L* x; g) Z6 ?                      f     // 普通文件
% W+ V" b1 m% \9 W# k! S, ~3 ?* S4 V; p# H/ E* B2 `- y
                      d     //目录文件& t+ K- U1 W* l8 Z. O" i
/ X. M" x' z; I
                      l     //链接文件+ l% s5 i2 |: ?( }; \3 L( n
# D/ z, [0 g/ ~5 y6 Y# X
                      b     //块设备文件9 {% T$ f1 g5 v8 u( x, z9 L
! b" ]* ^' E$ u. z+ G2 e1 G. b
                      c     //字符设备文件
0 ^7 A: A5 F, y1 E  C
) E# @) t# @3 D7 w/ {                      p     //管道文件7 R3 d4 I- u- ~7 E0 t& b( Z) E
) |* U3 A' P6 K0 s' j# c
                      s     //socket文件
' @, k% Q1 g' e7 W5 K/ V: c- r% u4 Q3 c! h3 a- T% I* K5 q! K

! q( s7 ~) V& \, J+ J( E/ ^5 j( Y' A* {, [5 {2 ^0 k

4 H. }; R1 N) t4 Z" Y; J        (7),根据大小来查找文件! Q  S3 C3 k; d

1 v, Q5 L6 M1 f" U               -size
$ _# {1 C+ Q% k. A- @$ a, g; H
0 e7 [2 Q  T9 ^7 i7 B, a$ c  D          #find  /tmp  -size   2M           //查找在/tmp 目录下等于2M的文件
) r+ e( |5 P9 e% G+ u# h) A" A' ]7 O/ ~5 q9 c
          #find  /tmp  -size  +2M           //查找在/tmp 目录下大于2M的文件
! ?% k- [/ z2 T: [4 t3 I
1 ]* O& |( b% s          #find  /tmp  -size  -2M           //查找在/tmp 目录下小于2M的文件- @9 ?0 w2 }9 |1 g; F0 a" x6 @

+ S0 E, k' [; I5 c% x. A% d           (8),根据文件权限查找文件
8 a4 m6 d9 p) S* ]4 E; z* u' m, \1 S4 \" Y6 o
              -perm
* i2 w0 o) `: L1 P! w5 c  x
+ g( E" a+ U$ U  r+ M' k2 A          #find  /tmp  -perm  755           //查找在/tmp目录下权限是755的文件
9 V6 X' a0 D: ^: v* A
: I2 p/ k( i1 a          #find  /tmp  -perm  +222          //表示只要有一类用户(属主,属组,其他)的匹配写权限就行( k- r2 C; J; P  {  r3 ]( y  x, c
. E6 D  r+ I% J% k
          #find  /tmp  -perm  -222          //表示必须所有类别用户都满足有写权限
  Y0 S/ T5 b0 ]7 N& R* i% d1 o+ I% P% ?. P
           (9),-nouser  and  -nogroup- F& @/ h$ e0 x! l, }  }; S

- _& X5 b5 S, X  |  `          #find  /  -nogroup –a –nouser       //在整个系统中查找既没有属主又没有属组的文件(这样的文件通常是很危险的,作为系统工程师的我们应该及时清除掉). B3 a$ ~; R5 n8 ~- b1 m

) P! f: S" ^1 d1 `6 B! m7 Y  [查找完执行的action]
0 E' ]/ H3 n0 S! s4 l
5 ?$ ^( k5 I5 }" Y$ P& O( ?# ~! r2 Z         # -print                                 //默认情况下的动作
3 H5 V1 |( H. {5 J1 }; H2 D" F& Q
4 i# e; R1 J# t8 v2 d' z8 |         # -ls                                     //查找到后用ls 显示出来7 o* {7 B- V8 u" G

  _: X/ P& N- Q$ Y! z, ?         # -ok  [commend]                //查找后执行命令的时候询问用户是否要执行
7 D& N" d5 E, T9 e4 u
* ]5 l. [$ |' g; b        # -exec [commend]              //查找后执行命令的时候不询问用户,直接执行: J% m- j$ P0 h$ }/ t: W2 `, {
* N) M% s$ w9 L9 i0 L+ q

0 Q# u% Z. w$ v  J0 n( @6 A
5 g( b1 q* }1 E9 y; n, n1 w
6 n6 g! d( ^. v: g' j这里要注意{}的使用:替代查找到的文件0 h1 w6 g' d! ^7 `% |8 |0 `. L" n

$ q" o; G1 P/ R& C5 d$ \" D3 G& ~

9 Y; t8 _) E! w; n: P3 e
& y% v# o3 ~! ^/ s# Y2 e# H2 y" v. @   3 _- _, t$ g/ a2 Q3 A
     #find  /tmp  -atime  +30  –exec rm –rf  {}  \; #删除查找到的超过30天没有访问过文件# S( x3 z4 y0 L5 m: ]) T: v/ D7 S

6 @* C/ h2 }7 r- B5 L     我们也可以使用xargs来对查找到的文件进一步操作
) Z1 {4 E2 y2 j
, x5 E9 T$ N5 _
0 p0 j: m6 C0 Y! E
   

作者: CCxiaom    时间: 2019-12-9 20:01
看看楼主说的用法。




欢迎光临 EDA365电子论坛网 (https://bbs.eda365.com/) Powered by Discuz! X3.2