|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
简要总结一下linux下find命令即文件查找命令的用法) R5 F3 E9 o# Z2 H0 T
- L7 d$ Z" K$ v( M, z& Q
7 T, ?; m# E; i6 Z' Y$ B3 j5 C
前言:我们为什么要学会使用find命令?/ a. m' s4 J$ K8 s5 Y" ^ a
3 z. I4 }, l" [: i
每一种操作系统都有成千上万的文件组成,对于linux这样“一切皆文件”的操作系统来说更不例外,大家应该都能很轻松使用windows下的文件查找功能,但是对linux这一功能可能并不是很熟悉,其实想玩linux的你更要牢牢掌握这个命令,因为linux不像windows那样有固定的文件名后缀,并且因为linux阵营下百家争鸣的特性,一个相同的文件在不同的发行版,可能会有不同,所以如果你能牢牢掌握find命令的使用,你在摸索linux的道路上将会顺利很多,同时你会发现linux下文件查找功能其实很简单,而且要比windows下查找功能强大很多很多!好,下面进入正题
7 @" u; b0 X: ?1 ?, p' I, G% [5 E- `8 j8 V, }. j
; M3 r3 i: x: g! {7 H
Linux下查找文件的命令有两个;locate 和 find7 o6 U7 f" E0 a3 k- G
8 Z, b6 b) ] b$ D, I' V& [
首先说下locate,locate这个命令是对其生成的数据库进行遍历(生成数据库的命令:updatedb),这一特性决定了用locate查找文件速度很快,但是locate命令只能对文件进行模糊匹配,在精确度上来说差了点,简单介绍下它的两个选项:
7 V/ t" @! S6 p" ~' j+ W& X
0 q: E& A: H- y/ b3 T) ~ #locate 6 f' S% R$ J# p
' ~& J! f% _4 c
-i //查找文件的时候不区分大小写 比如:locate –i passwd7 g7 a- D' ^$ h* l2 T0 V
# L+ {+ T- B9 _; [. O; F/ L -n //只显示查找结果的前N行 比如:locate -n 5 passwd* ^ B8 r* B! n6 {
; B. U \* |' P5 [( P# F n% Q4 \5 V! p
下面重点说下find,find在不指定查找目录的情况下是对整个系统进行遍历查找
& o2 E9 k; ]7 b- d1 F( u& k9 _. k% n3 Y
使用格式 : find [指定查找目录] [查找规则] [查找完后执行的action]
7 ~8 J# R3 R% j* k6 Q$ Y) ?7 @' ^3 B, ?* x. }; p6 v, a/ B
[指定查找目录]例如:
% b% y5 O3 m, `( V/ n) X) J
* f( J8 U! Z* x/ `2 V% b
9 A t& d; h$ c9 u7 t' Y' x' r# M6 j- A0 ?: e: I( [
这里要注意的是目录之间要用空格分开
% {$ f9 S! O9 Y9 D4 J* `$ I5 @( X( s# O# `1 w7 V: c- N
[查找规则] 7 l; `* \: y" W6 l; ]" Y
6 L: H6 s, I u (1)根据文件名查找0 c- K u& _& W% F
/ B1 s( B9 E, [' e # -name //根据文件名查找(精确查找)6 `9 w* {) i* I' d" ]+ e
' J0 D" f. l+ Z" E& v' Y; M # -iname //根据文件名查找,但是不区分大小写
4 X! `5 T; O) ]( c$ ]" K8 z7 s) V3 C+ T2 e& M) C
这里另外介绍下文件名通配的知识
( O8 v9 C4 ~" g4 I# G7 S& S6 C, Z: A; p# n n) f7 Z
*表示 通配任意的字符8 I' ^% k( Z5 Z6 Y3 H! U# I
( X/ Z/ c4 I6 P% U b
- d) ~" i9 D& x
: U) m/ k! `1 ?9 A6 a. F& G. h j ?表示 通配任意的单个字符% W0 \7 U, P2 [' C+ h
! Y% U. p: g- B/ ~
- @5 ]$ Q' c. `# p" E6 Y ( P( |& ?+ ~8 k( l, }
[ ] 表示 通配括号里面的任意一个字符7 j$ k+ l, o' x8 r+ f) Y4 S
/ N2 u& B8 N* n- o# X% x
# ^3 M S3 U& R5 [0 m( j# U/ s' P) A+ Y8 O i
(2),根据文件所属用户和组来查找文件
E$ K0 s. S9 s9 {& l0 x2 s* a- y5 Q! i
# -user //根据属主来查找文件6 P1 b& m8 }2 w, E, V
: ?. a& ^& n+ C' X5 J # -group //根据属组来查找文件$ Y- U p) u; z7 G, s _
2 U1 o- y8 y1 U$ K3 O, B. f$ `2 y: C (3),根据uid 和 gid来查找用户
2 d/ C& R; v# j$ A4 |. u! v( x2 U' R- _ v
#find /tmp -uid 500 //查找uid是500 的文件* U, i1 y1 H2 W
8 z* \3 x3 k1 L- ]% |. e
#find /tmp -gid 1000 // 查找gid是1000的文件
, V! J- u, j; X j/ P* }
# N9 S6 w8 K% M: v T0 H# o (4),-a and -o and –not的使用, @% q3 o5 p% u: F/ R; m
/ `- ]; E8 d" H. _ # -a 连接两个不同的条件(两个条件必须同时满足)
3 y- R6 [8 S3 ^% W
, {' ?2 H7 F! a' c; b6 ~! _" }: J
: U" ?0 U2 ?0 G: `; e8 e! f1 m8 P) _: P- E
# -o 连接两个不同的条件(两个条件满足其一即可)
, K6 _. q; r; M1 J5 u; O1 Z* t5 y! @& [) j- j4 L# N9 y& u
# -not 对条件取反的% T5 { @' x/ `" D
1 F* N9 e$ ~0 [+ ^! d
" R7 h& r1 E l% `
8 a) r& f1 G4 _/ q! |
(5),根据文件时间戳的相关属性来查找文件
, O! U5 f, r$ i: B
: V1 C# J$ J% A: B& P( g. `1 r 我们可以使用stat命令来查看一个文件的时间信息 如下:
* p H- x' S e; Y5 }; [% q; }+ k! I% ]4 U
$ q" ? W( b; f
: N- h/ g* w/ R4 Y3 G
& ?2 W5 \+ C6 p/ O. G #-atime" x/ f: ~; D w. o- c
% ?& g y. ~. p- E% f; U
#-mtime
- u4 N6 }2 d2 ~$ r* E
8 ?! ~4 ~! l( U$ Y1 g1 Q9 I #-ctime' v6 n, N9 \1 W( ^4 L' N1 `8 D8 U) ^
) R6 l$ E$ m/ b: n, y& } #-amin
) A0 `5 }# Z; h
9 v3 U7 g0 P# r' m' D #-mmin
' L, T* c) O& I5 }
0 }: r: f& [6 Z2 I" R+ Q/ D #-cmin6 }2 m. C7 [' q4 e7 b. m7 Z
2 W& c. l% J" v, e( X$ b6 b, ^
# u0 p! A8 G) @0 w* y" s, x1 ^( `
所以这里atime,mtime,ctime就是分别对应的“最近一次访问时间”“最近一次内容修改时间”“最近一次属性修改时间”,这里的atime的单位指的是“天”,amin的单位是分钟
6 u, Q, [/ A: N# w5 }9 Z- T# t) r. r% c
S( N6 b" Y7 p6 @3 {8 [ #find /tmp –atime +5 //表示查找在五天内没有访问过的文件2 f/ Q( s. z* g" G- g% S
# y4 v# T9 K# K1 C5 G- ~& _
#find /tmp -atime -5 //表示查找在五天内访问过的文件
1 r" c+ f q& E7 q5 Z; @1 Q- U- R' V+ T/ O2 O0 ~' d& J' S
6 h! l0 B& U7 `5 F (6),根据文件类型来查找文件! |0 C. w8 V* k; T+ b
c$ F* k- _! f2 H
-type
/ F& z* |% [3 _: ?2 E; z
) E5 K0 ^/ v$ M f // 普通文件
8 U3 j& d* w0 _$ E8 ^9 h+ ?4 }6 ]# O2 ]
d //目录文件. g2 u% F9 T# X
- D; Q4 F( I# X7 `1 M6 U( B7 M l //链接文件5 G# G$ R/ T6 m9 @4 U% L2 {
' B* ^3 Q- f1 x b //块设备文件) }5 e, t! W- c/ ~- r" e
/ `1 a3 c- P6 C R8 G0 @
c //字符设备文件6 T1 H3 c4 Z$ j' H1 N
, H) O; k- u; M* M# Z4 y' U p //管道文件! w ?9 S# }0 }/ w- u& }/ H5 J
* \8 g- u6 F$ _ r, ` h
s //socket文件& v% m9 ]7 A% s" J+ d- a
, l8 q5 P3 P/ w! b/ W. A" p& v2 h
$ L0 E8 w( y8 W# i! e' J- S( _8 ]' X7 C7 W# G
2 \8 y3 {) z9 B* `
(7),根据大小来查找文件
) F! j& X* d; ?+ I$ |% f& y' r8 ^# J0 s) a; X
-size, n' R) e _6 X# B' r& [
' R a3 R- [6 ^, s #find /tmp -size 2M //查找在/tmp 目录下等于2M的文件
9 B, c3 H7 M( R+ I/ J& b1 m4 W+ {2 d
#find /tmp -size +2M //查找在/tmp 目录下大于2M的文件
4 x& t; M# [4 T! I# o5 p8 J( w7 w' W7 s$ W: r1 W
#find /tmp -size -2M //查找在/tmp 目录下小于2M的文件
$ }! R% X& c2 M, r( }! z4 z$ g4 S0 M
(8),根据文件权限查找文件
2 R5 F& V% S3 D" I: [- r+ \$ p; Y' R$ M. T5 {
-perm
. ^0 n, G% [3 h/ |
: {; Z P7 t3 o% J #find /tmp -perm 755 //查找在/tmp目录下权限是755的文件
' F8 C, E( _7 W, g: n
: ~, a V3 ?, A: r8 [ #find /tmp -perm +222 //表示只要有一类用户(属主,属组,其他)的匹配写权限就行2 X+ N+ K; r: d' E
9 S+ N6 E* ]9 }: y #find /tmp -perm -222 //表示必须所有类别用户都满足有写权限( u3 k& S4 k1 A$ P# t1 |
' p- p9 ]6 d y/ w1 V (9),-nouser and -nogroup$ g* U! H. y9 Z' L
3 P5 [. |: l$ ?0 p. H" ]# h! {( b
#find / -nogroup –a –nouser //在整个系统中查找既没有属主又没有属组的文件(这样的文件通常是很危险的,作为系统工程师的我们应该及时清除掉)
4 p# S X1 E* m
5 H/ D/ d( U; `0 O [查找完执行的action]
. F) r, ^, ~, g- v+ d& |$ O
1 u+ H1 e5 N0 E8 T # -print //默认情况下的动作# a5 x* H9 r8 }8 _! U
5 T' c& ? ~# L3 F( F
# -ls //查找到后用ls 显示出来3 r; H3 _% M' A" N" n
/ P2 u- m( B' h( n1 i
# -ok [commend] //查找后执行命令的时候询问用户是否要执行
# N }0 R8 R' R7 R/ X# y2 g! E1 y! l+ f+ v8 B. u" d9 ^
# -exec [commend] //查找后执行命令的时候不询问用户,直接执行
- g( I' O6 e. W' o4 {* F
4 a( N& {- U$ o5 W
9 x& O5 y$ U: K$ h' W2 H. j
7 M4 L! F4 f, W; X9 s( m% d; j5 v$ ]( N4 T: e9 D
这里要注意{}的使用:替代查找到的文件
' J$ r! U5 q) z/ b! E2 k
! X/ z$ z: g/ l# B
+ H2 Y) b: p+ X' ^* Y3 `5 k
0 p: D2 I% W; a+ d( s. H' z & U- u5 p m9 x2 c- ?! T1 K0 Q
#find /tmp -atime +30 –exec rm –RF {} \; #删除查找到的超过30天没有访问过文件, W9 R! g/ O, ?; {
6 Y b( |% z$ m% X' _
我们也可以使用xargs来对查找到的文件进一步操作
# w* L5 w3 L. m: j# ]! n; J. z: d' z& \$ Z! X! s' b. h$ d2 R' J# j
- h T: |+ o: z/ c: u: v) o |
|