find命令详解(zz)

上一篇 / 下一篇  2008-08-25 14:18:35 / 个人分类:基本知识

51Testing软件测试网\J3mV-F:u+}x

版权声明

R0ZG U6l/q051Testing软件测试网0|'^Q*`s#x |'x

51Testing软件测试网2k:aoGK^
本文是zhyfly兄贴在LinuxSir.Org 的一个帖子而整理出来的,如果您对版权有疑问,请在本帖后面跟帖。谢谢;本文的HTML版本由北南南北整理;修改了整篇文档的全角及说明文字中的单词中每个字母空格的问题;为标题加了编号,方便大家阅读;

Seo(v5n[0

m0zQc Y$v6p0前言:关于find命令51Testing软件测试网:ZR s*LnVt|

2N%[D2mf%Fm0由于find具有强大的功能,所以它的选项也很多,其中大部分选项都值得我们花时间来了解一下。即使系统中含有网络文件系统( NFS),find命令在该文件系统中同样有效,只你具有相应的权限。

Z:? z(k"g ];Q3}mB(}F051Testing软件测试网uk D3T4M$d~;q:_eT

在运行一个非常消耗资源的find命令时,很多人都倾向于把它放在后台执行,因为遍历一个大的文件系统可能会花费很长的时间(这里是指30G字节以上的文件系统)。

)|4SktjELS051Testing软件测试网 ?+?+l(mR-iqFS1A(o


m8_&}9Y/bm U0一、find 命令格式51Testing软件测试网h@8F_V

L ^`qHj!u0 51Testing软件测试网:^ ]C f/eel0B

DxgP~Q&Gt0~D01、find命令的一般形式为;

c$VVUW[qL:`P051Testing软件测试网&sY_E[4fL

 51Testing软件测试网*n1e0]+E3e V!ehF8f

51Testing软件测试网 {0i*IHhv

find pathname -options [-print -exec -ok ...]

!S(E!V Y[J1I:?$T+|'q0

^6CU`:n0]#R%t0
/V3X j-~Fs02、find命令的参数;51Testing软件测试网 ~;k'Bt?N-hH7z

51Testing软件测试网zJg5s{+a/r

 

X"R9nIn[z)V@'a0

%PN'a?N I0pathname: find命令所查找的目录路径。例如用.来表示当前目录,用/来表示系统根目录。
4Vp'dgOo0-print: find命令将匹配的文件输出到标准输出。
rL,m~#}d^(S0-exec: find命令对匹配的文件执行该参数所给出的shell命令。相应命令的形式为'command' { } \;,注意{ }和\;之间的空格。
XZ3q.{ }{DPQ0-ok: 和-exec的作用相同,只不过以一种更为安全的模式来执行该参数所给出的shell命令,在执行每一个命令之前,都会给出提示,让用户来确定是否执行。

h Z&jBPV9A.m)vt0

u~pdJN%B051Testing软件测试网FF jV[3D/J;`#y"R(?
3、find命令选项51Testing软件测试网tu o+ED%x1S

51Testing软件测试网(C&H3v3E6Qs cT

 

5mR7P5cwU[-wC051Testing软件测试网 T"cL2onL

-name
$r-t4K`zS1uQD!s0按照文件名查找文件。
k]4o;yf:\p0-perm51Testing软件测试网"xV~W~L3|'}4U(u
按照文件权限来查找文件。51Testing软件测试网-C6`y C_ HX)J
-prune
%_x5M.T3J+|8RwI0使用这一选项可以使find命令不在当前指定的目录中查找,如果同时使用-depth选项,那么-prune将被find命令忽略。51Testing软件测试网*Pz/tUr
-user
I$|RRTY8p0按照文件属主来查找文件。51Testing软件测试网 d*F)Cl!cs:F)?G
-group
(^D_/Fz U.v9R1t"a0按照文件所属的组来查找文件。51Testing软件测试网'^9Qn%sf
-mtime -n +n51Testing软件测试网:CQz3O$E'g z%} EF
按照文件的更改时间来查找文件, - n表示文件更改时间距现在n天以内,+ n表示文件更改时间距现在n天以前。find命令还有-atime和-ctime 选项,但它们都和-m time选项。
j:ISF D0-nogroup51Testing软件测试网3w{8K2w.M3]
查找无有效所属组的文件,即该文件所属的组在/etc/groups中不存在。51Testing软件测试网Or v Pf y"t
-nouser
\BIcR;@u0查找无有效属主的文件,即该文件的属主在/etc/passwd中不存在。
m??m(N ZR5B0-newer file1 ! file251Testing软件测试网8q&eRU[6].?#[
查找更改时间比文件file1新但比文件file2旧的文件。51Testing软件测试网7P6SE,lm:BE({2v4c)j:n
-type
*B9fg5Sm J3ttn0查找某一类型的文件,诸如:51Testing软件测试网jX2y]C!O i
b - 块设备文件。
iOa|.t0d - 目录。
Agv6l:w q3Y0c - 字符设备文件。
)X e"ME_3mk!T0p - 管道文件。
4^ }vx9o,]+j0l - 符号链接文件。51Testing软件测试网T] tml,Hv\~
f - 普通文件。
'N!?`[]_0-size n:[c] 查找文件长度为n块的文件,带有c时表示文件长度以字节计。
%w5Y;V-u*~X0-depth:在查找文件时,首先查找当前目录中的文件,然后再在其子目录中查找。
x(D.gw(erq0-fstype:查找位于某一类型文件系统中的文件,这些文件系统类型通常可以在配置文件/etc/fstab中找到,该配置文件中包含了本系统中有关文件系统的信息。51Testing软件测试网R F,nH2}s
-mount:在查找文件时不跨越文件系统mount点。51Testing软件测试网n8c I1ga&]6H{0u2s
-follow:如果find命令遇到符号链接文件,就跟踪至链接所指向的文件。51Testing软件测试网7j*VAN N[4? NK
-cpio:对匹配的文件使用cpio命令,将这些文件备份到磁带设备中。

|7? Za2L Ho051Testing软件测试网a!yl$iA,H4S9\n(PF

另外,下面三个的区别:

,[7J1RbErP4G051Testing软件测试网q8tt]A


Cl)`o2s.[1R[ X0   -amin n
*bxn;k8pC0  查找系统中最后N分钟访问的文件
Rajw%W}b!u0  -atime n51Testing软件测试网(F(\x&|*^*F
  查找系统中最后n*24小时访问的文件51Testing软件测试网W_o1[t S@:h
  -cmin n51Testing软件测试网5E ]ck*L!@ }8sn
  查找系统中最后N分钟被改变文件状态的文件51Testing软件测试网 UgqO.V6l
  -ctime n
uB;CZ5[@7]6t:U%s0  查找系统中最后n*24小时被改变文件状态的文件
\ t[ I;r it+Za0s0    -mmin n51Testing软件测试网#VN4}fIa2p
  查找系统中最后N分钟被改变文件数据的文件51Testing软件测试网P-i~ Y*\4xz]3h
  -mtime n
UC#S0\.ZHb0  查找系统中最后n*24小时被改变文件数据的文件51Testing软件测试网4s ? |W t&i

51Testing软件测试网XrT e7N8}ck

51Testing软件测试网.F7}D[hC
4、使用exec或ok来执行shell命令

$_ heb rp9O/h051Testing软件测试网h4_N#@}z'~%`

51Testing软件测试网[$QTwZ.b7Ap
使用find时,只要把想要的操作写在一个文件里,就可以用exec来配合find查找,很方便的51Testing软件测试网1b6rs1G3ZP?

51Testing软件测试网m$`O_"ez+Gi R'l

在有些操作系统中只允许-exec选项执行诸如l s或ls -l这样的命令。大多数用户使用这一选项是为了查找旧文件并删除它们。建议在真正执行rm命令删除文件之前,最好先用ls命令看一下,确认它们是所要删除的文件。

Th Efx C^'Kh0

F0G&ou0K2i0exec选项后面跟随着所要执行的命令或脚本,然后是一对儿{ },一个空格和一个\,最后是一个分号。为了使用exec选项,必须要同时使用print选项。如果验证一下find命令,会发现该命令只输出从当前路径起的相对路径及文件名。

$\j `;pXxdA051Testing软件测试网1o] FN/K'k2|

例如:为了用ls -l命令列出所匹配到的文件,可以把ls -l命令放在find命令的-exec选项中51Testing软件测试网L-U+EC6@-gz+e7U)q/X$@

s-ym XJ051Testing软件测试网c)|U%D#jz/z'z+z
# find . -type f -exec ls -l { } \;
z'M#Iujy0-rw-r--r-- 1 root root 34928 2003-02-25 ./conf/httpd.conf
C F C9D.V G `;~#IY0-rw-r--r-- 1 root root 12959 2003-02-25 ./conf/magic51Testing软件测试网\g+aw,o NU:F P Z
-rw-r--r-- 1 root root 180 2003-02-25 ./conf.d/README

K wT#Ho1^Y{H051Testing软件测试网KDYw-l:\3zF

上面的例子中,find命令匹配到了当前目录下的所有普通文件,并在-exec选项中使用ls -l命令将它们列出。
v i?[ Ls4b"w0在/logs目录中查找更改时间在5日以前的文件并删除它们:

i _7z:qU(nEH3f:B0

tmwp#E4i9h d6Jn9A,we0
|4[Z7w:DF(@0$ find logs -type f -mtime +5 -exec rm { } \;

A,a-XA,CH7E5{&`0

g:P%N+tpiK0记住:在shell中用任何方式删除文件之前,应当先查看相应的文件,一定要小心!当使用诸如mv或rm命令时,可以使用-exec选项的安全模式。它将在对每个匹配到的文件进行操作之前提示你。51Testing软件测试网Ia6U#W7xo

51Testing软件测试网I%M6ah:MJ \&gB"xf

在下面的例子中, find命令在当前目录中查找所有文件名以.LOG结尾、更改时间在5日以上的文件,并删除它们,只不过在删除之前先给出提示。

4M"i`r7j l6K#B051Testing软件测试网*HTTP'Q]Yh8ld

51Testing软件测试网}%x;_ aE$u*L
$ find . -name "*.conf" -mtime +5 -ok rm { } \;
:eea-H C4vJ\6f0< rm ... ./conf/httpd.conf > ? n51Testing软件测试网|6V7q H8J D:z0i

51Testing软件测试网b;KE5yLN6| ?

按y键删除文件,按n键不删除。

q8} w/vR,p#K|051Testing软件测试网 u R+J#H ny@qj3c

任何形式的命令都可以在-exec选项中使用。

\U-I9Xp2Y}0

&@+cU4}8J-x1k*Y0在下面的例子中我们使用grep命令。find命令首先匹配所有文件名为“ passwd*”的文件,例如passwd、passwd.old、passwd.bak,然后执行grep命令看看在这些文件中是否存在一个sam用户。

*s7y6HD'A0

fR$O8b)K%c/^#S-r;z0
No)qC-o{%M0# find /etc -name "passwd*" -exec grep "sam" { } \;
y|w7g?_"Z;~0sam:x:501:501::/usr/sam:/bin/bash51Testing软件测试网Y1OC~;Rk \!M$f

cd-B$b3D j!L,B051Testing软件测试网g!ypZd {
二、find命令的例子;

XK2_b OQ+[,\051Testing软件测试网rz K;f h

 

!_RK7p;ex,SA0

Y W6h+k3f1W01、查找当前用户主目录下的所有文件:

_ x:u-rX5u?0

$wz*V,y+f4GfQ4r:?2\0
~2c'G:m{l(P)E[0下面两种方法都可以使用51Testing软件测试网Or2}'|/H7XHL

51Testing软件测试网^ B T$x`W XY pW*t


/lk0RRC2_5r j0$ find $HOME -print51Testing软件测试网3s.o8eJ*@"B
$ find ~ -print

"qp5B5l%Qa0

1lz"G W?Zn qQ051Testing软件测试网#\rf@9D;B6\h
2、让当前目录中文件属主具有读、写权限,并且文件所属组的用户和其他用户具有读权限的文件;

1Go?l\ Q9f051Testing软件测试网 YW \kV5n f:Q

 51Testing软件测试网!MhQ)M)MB

51Testing软件测试网A/c%DO _?i ^

$ find . -type f -perm 644 -exec ls -l { } \;51Testing软件测试网v4nsk9k[

51Testing软件测试网7ia!w%o r*X*g*I7j$H$C#v

51Testing软件测试网\p sJ;x0i
3、为了查找系统中所有文件长度为0的普通文件,并列出它们的完整路径;51Testing软件测试网0D6Z"W+pU

fN"mQZ0 51Testing软件测试网'`e1Gy3`

1m;C V(A&P%Fm0$ find / -type f -size 0 -exec ls -l { } \;

[M h B Np!~o051Testing软件测试网)pT8J4h1l t9Y L8h6B4[

51Testing软件测试网m5@km-J,Owy3{h
4、查找/var/logs目录中更改时间在7日以前的普通文件,并在删除之前询问它们;

D]ss_!q-`t0

jkI7peQ-EEN0 

6X.^qT9M%C051Testing软件测试网?1X7Ba&B

$ find /var/logs -type f -mtime +7 -ok rm { } \;51Testing软件测试网*cytg [6xQ

51Testing软件测试网m$fK'dr8w

51Testing软件测试网'm'hPL$S,e*b
5、为了查找系统中所有属于root组的文件;51Testing软件测试网"D nq5@%Z.f[

51Testing软件测试网AfV3I!moipz

 

-w'p8Mi%^YuV051Testing软件测试网 UU D _Al&y

$find . -group root -exec ls -l { } \;
2Ya%KM;T?ie0-rw-r--r-- 1 root root 595 10月 31 01:09 ./fie151Testing软件测试网Ej3DD*y3M'S6\ `0H-o

nHg6j-E2d B0
MrZ(Y)LT |x5J U06、find命令将删除当目录中访问时间在7日以来、含有数字后缀的admin.log文件。51Testing软件测试网\{ e#G[5`'nf

it*V8M'O'}X`051Testing软件测试网)aI,`hu%I/C.D
该命令只检查三位数字,所以相应文件的后缀不要超过999。先建几个admin.log*的文件 ,才能使用下面这个命令51Testing软件测试网@d:ckPv C`9E

nDg_ T4Z/S~ L \0
6z&Jx1| HBc zR0$ find . -name "admin.log[0-9][0-9][0-9]" -atime -7 -ok51Testing软件测试网8w0xPf/B)L,aX
rm { } \;
i?/j7[ RK0< rm ... ./admin.log001 > ? n
w'i'G'oxn o f0< rm ... ./admin.log002 > ? n51Testing软件测试网7Bpsz+t3Ur!xR
< rm ... ./admin.log042 > ? n51Testing软件测试网k(U5uw~['_pqe
< rm ... ./admin.log942 > ? n

^`$W x%aB051Testing软件测试网I5Zu`Z0Q


(f0ci%y!p1Bn&I07、为了查找当前文件系统中的所有目录并排序;51Testing软件测试网?#G7r:X1]x,vQ%~)a

51Testing软件测试网)F'I3{g7B} b*k#K

 

Ql"?N8lQ/{~051Testing软件测试网i8NXcS)oO }

$ find . -type d | sort51Testing软件测试网Vw(bqRO

51Testing软件测试网'q_ a9b q.H1l8Ys


n_.qHX Y!}5{h f/A08、为了查找系统中所有的rmt磁带设备;

k@4Jq'q5r'|1u0

'U8O9q:z^;yu0 

"i(Gy)rZ4vB*?-H0

8uNW9i2|0$ find /dev/rmt -print

Y F)a4E3N`D-DN0

M)F[anN051Testing软件测试网9~9CmZ`4z#gH|
三、xargs

#j.L"} w-i/sR}O^[051Testing软件测试网 rk&jWB;g+F


k^U bF e n0xargs - build and execute command lines from standard input

C `S4q!J V051Testing软件测试网 b&a8n5FM5nf

在使用find命令的-exec选项处理匹配到的文件时, find命令将所有匹配到的文件一起传递给exec执行。但有些系统对能够传递给exec的命令长度有限制,这样在find命令运行几分钟之后,就会出现溢出错误。错误信息通常是“参数列太长”或“参数列溢出”。这就是xargs命令的用处所在,特别是与find命令一起使用。

U2d\@"R$R,}8z0

b[MRH0find命令把匹配到的文件传递给xargs命令,而xargs命令每次只获取一部分文件而不是全部,不像-exec选项那样。这样它可以先处理最先获取的一部分文件,然后是下一批,并如此继续下去。

H V1j `yc0

+i7bG h7F0在有些系统中,使用-exec选项会为处理每一个匹配到的文件而发起一个相应的进程,并非将匹配到的文件全部作为参数一次执行;这样在有些情况下就会出现进程过多,系统性能下降的问题,因而效率不高;

#X1Q r a {I6}2q4m0

7E*x;g mc6n"M0而使用xargs命令则只有一个进程。另外,在使用xargs命令时,究竟是一次获取所有的参数,还是分批取得参数,以及每一次获取参数的数目都会根据该命令的选项及系统内核中相应的可调参数来确定。51Testing软件测试网%O"yMb0L~&j

W TXz3FA\0来看看xargs命令是如何同find命令一起使用的,并给出一些例子。51Testing软件测试网}._&R:F1r)@

51Testing软件测试网dlr T:D

下面的例子查找系统中的每一个普通文件,然后使用xargs命令来测试它们分别属于哪类文件51Testing软件测试网qV:xv&?k

(z6s M Rw$rG3bO'hW0
8^Dx#p1K3`[0#find . -type f -print | xargs file51Testing软件测试网4RF!b9I6V7A'i
./.kde/Autostart/Autorun.desktop: UTF-8 Unicode English text
n:p3k)[w Y0./.kde/Autostart/.directory: ISO-8859 text\51Testing软件测试网)nH.`7n6o+U0U.A
......51Testing软件测试网)_ @Y%^1K,M+XZ Z

51Testing软件测试网dP-ff_8g }xQAO

在整个系统中查找内存信息转储文件(core dump) ,然后把结果保存到/tmp/core.log 文件中:51Testing软件测试网8?*_8F'hY/JVT'A

51Testing软件测试网]J7Yi:EMp

51Testing软件测试网(UP6\XH:vT{:L
$ find / -name "core" -print | xargs echo "" >/tmp/core.log51Testing软件测试网"N8j@/bA {\U)W+w

#aw&H8Q_i0上面这个执行太慢,我改成在当前目录下查找51Testing软件测试网4T-|,fVv

51Testing软件测试网'OLa| X{Xr

51Testing软件测试网ge#D-`#y{0t*B
#find . -name "file*" -print | xargs echo "" > /temp/core.log51Testing软件测试网J!]^ \:B m Q wZ
# cat /temp/core.log51Testing软件测试网 lGa7t6[)Q
./file6

ce be.r'^2mX5h051Testing软件测试网8["u N$AO&_p

在当前目录下查找所有用户具有读、写和执行权限的文件,并收回相应的写权限:51Testing软件测试网:HvQPu@d2f3P @

0wJ$se/_"mI2zC'u)Hog051Testing软件测试网Fe;TJS&k(\t8T
# ls -l
!l8U1UwYOf-y2w0drwxrwxrwx 2 sam adm 4096 10月 30 20:14 file6
&@ Rb1B0q4G+X0-rwxrwxrwx 2 sam adm 0 10月 31 01:01 http3.conf51Testing软件测试网Do$i1lkm Ln
-rwxrwxrwx 2 sam adm 0 10月 31 01:01 httpd.conf51Testing软件测试网/p!C2`+tH
# find . -perm -7 -print | xargs chmod o-w51Testing软件测试网 Et4E9PP
# ls -l
&}JF3k p0drwxrwxr-x 2 sam adm 4096 10月 30 20:14 file6
p3Dx&pl4LS4H0-rwxrwxr-x 2 sam adm 0 10月 31 01:01 http3.conf51Testing软件测试网:v9d6sM/W_f8h W
-rwxrwxr-x 2 sam adm 0 10月 31 01:01 httpd.conf51Testing软件测试网h6z;y;M5t-jv

51Testing软件测试网2ekso-ys

用grep命令在所有的普通文件中搜索hostname这个词:

"YHd0{"R051Testing软件测试网R/FE$}DOR6W


;b0K3}Vlg!k0# find . -type f -print | xargs grep "hostname"
*g b&}(?\}hn6]H P#S0./httpd1.conf:# different IP addresses or hostnames and have them handled by the
'W?(W$yH8R4c0./httpd1.conf:# VirtualHost: If you want to maintain multiple domains/hostnames51Testing软件测试网 |SI?s}]
on your

1GZb1C lt J0

^*zx6y6fx1`)|;[,Z0用grep命令在当前目录下的所有普通文件中搜索hostnames这个词:51Testing软件测试网 d8qel_-wS

51Testing软件测试网m t4tF+nL'{$T


w0ozV'?)?1K"s0# find . -name \* -type f -print | xargs grep "hostnames"51Testing软件测试网+i"^K7F9Ok f[
./httpd1.conf:# different IP addresses or hostnames and have them handled by the
-RIp Re9w0\l Ns0./httpd1.conf:# VirtualHost: If you want to maintain multiple domains/hostnames
,e-s&d'`k2f M0on your

pJc_X4X0

~6zhM&Z+cMt0注意,在上面的例子中, \用来取消find命令中的*在shell中的特殊含义。51Testing软件测试网2C1a~5g,qU FC

n(h9H8Cn([C9d+L"i0find命令配合使用exec和xargs可以使用户对所匹配到的文件执行几乎所有的命令。

Jz4}R.O9ZHd W+A0

)kQ.h5Y5A#azX3G\0
]R Dfb{$X0四、find 命令的参数

k;Fil LT?x0

o{}$So YC)l0
k?{?E0下面是find一些常用参数的例子,有用到的时候查查就行了,像上面前几个贴子,都用到了其中的的一些参数,也可以用man或查看论坛里其它贴子有find的命令手册51Testing软件测试网+] T n3Ec

51Testing软件测试网-K Et*X7Qdx


a#w#w5l?5od)I5M6F |9@01、使用name选项

z(f ^-l9e}:Ra0

g$j2Qg;Y8L}rl051Testing软件测试网 xHw,J D
文件名选项是find命令最常用的选项,要么单独使用该选项,要么和其他选项一起使用。

c1C.Q6H!}aj|8It0

?-?x:jK'ck\0可以使用某种文件名模式来匹配文件,记住要用引号将文件名模式引起来。

:O4}w,_h;m051Testing软件测试网w2l8tDT"M

不管当前路径是什么,如果想要在自己的根目录$HOME中查找文件名符合*.txt的文件,使用~作为 'pathname'参数,波浪号~代表了你的$HOME目录。51Testing软件测试网.Na#jn6O

51Testing软件测试网w V `;SjW|6Jv

51Testing软件测试网h{`+}[0c0\-^y#O
$ find ~ -name "*.txt" -print51Testing软件测试网{3N:b|U j?]/r

51Testing软件测试网 yJ#\2{a.b

想要在当前目录及子目录中查找所有的‘ *.txt’文件,可以用:51Testing软件测试网#N,m,Er~"Z0~b

[j_GL l8z~0
aT(Zp)UW+x0{:`0$ find . -name "*.txt" -print

3D q,o9nO&yX._051Testing软件测试网/F` gjUe;b-u

想要的当前目录及子目录中查找文件名以一个大写字母开头的文件,可以用:51Testing软件测试网!A2c,{%G!M!{c1h`

1D&wK;c }1}v1q!Y051Testing软件测试网(Wu GK K4['Q
$ find . -name "[A-Z]*" -print51Testing软件测试网 |q,I7I!m

c$MJkrT0想要在/etc目录中查找文件名以host开头的文件,可以用:51Testing软件测试网!@+f9c1]8h8M0R

,N7}-A\e(H`9ih051Testing软件测试网%{Sp\Z)P$R
$ find /etc -name "host*" -print

?X1C"j'h2rfA#X0d0

R0j-A9B8LuG0想要查找$HOME目录中的文件,可以用:51Testing软件测试网x H.IMBkhb m

0vBT)e K v#V:j0
Q D6R3N9U(R e(iv0$ find ~ -name "*" -print 或find . -print51Testing软件测试网 f RJx@

51Testing软件测试网.Bo G!\8\Xy+G i

要想让系统高负荷运行,就从根目录开始查找所有的文件。

5L9r9a.b&[$?8iX051Testing软件测试网:?;S ?Yw,Ae


G!~2R6mj9S*X0$ find / -name "*" -print51Testing软件测试网$j2hz7@4M_&B*vl7q

51Testing软件测试网 |Y~1{^]%l U"d

如果想在当前目录查找文件名以两个小写字母开头,跟着是两个数字,最后是.txt的文件,下面的命令就能够返回名为ax37.txt的文件:

_)A+\Kh051Testing软件测试网C*g;CkN$u


v'h"p2Eh wv7u)Ho%H0$find . -name "[a-z][a-z][0--9][0--9].txt" -print

+l&S#rK F;]n'l"{"W5|B051Testing软件测试网'Nr B8Nr[)v!s6U

51Testing软件测试网M\s*~,v8b5A7M
2、用perm选项51Testing软件测试网&q$s KI'ig"{,o

51Testing软件测试网 PRr,`J/t6u

51Testing软件测试网3^0_ T!]YZxb.T
按照文件权限模式用-perm选项,按文件权限模式来查找文件的话。最好使用八进制的权限表示法。

@&MA,n~0

1DN7b F_8T5M+[0如在当前目录下查找文件权限位为755的文件,即文件属主可以读、写、执行,其他用户可以读、执行的文件,可以用:51Testing软件测试网 Va@h/hp9P

51Testing软件测试网d4L@:i(aP%N+n

51Testing软件测试网!L:?#}c7N8@ a
$ find . -perm 755 -print

~ K_#OCt&T0

"eO!J [LZ"sU8m1s0还有一种表达方法:在八进制数字前面要加一个横杠-,表示都匹配,如-007就相当于777,-006相当于666

Y'~:tzz]N0

&mzt!yw+d0
h,i ` Hv?w;s%r9VN}n0# ls -l51Testing软件测试网 ?BM/E+?$g(w#O*Q
-rwxrwxr-x 2 sam adm 0 10月 31 01:01 http3.conf
H6T0J-L&a3txw0-rw-rw-rw- 1 sam adm 34890 10月 31 00:57 httpd1.conf
m,N8w|A0-rwxrwxr-x 2 sam adm 0 10月 31 01:01 httpd.conf51Testing软件测试网+OYK-aE"p V
drw-rw-rw- 2 gem group 4096 10月 26 19:48 sam
3B.o Tj`3S S0-rw-rw-rw- 1 root root 2792 10月 31 20:19 temp
_&SG!m!Q}2?0# find . -perm 00651Testing软件测试网 r$k,D t%@'[`M6q
# find . -perm -006
^9AZz.r%H,~0./sam51Testing软件测试网0@7KNjA*ThsP
./httpd1.conf51Testing软件测试网+pC zD(@kt+Z
./temp51Testing软件测试网B&N]3X/P{#NCj

51Testing软件测试网V^1i\.e"T9m9h

-perm mode:文件许可正好符合mode

T&y4Jh b r051Testing软件测试网h:g!d!}3XQ

-perm +mode:文件许可部分符合mode

Qq;a w9FWS t051Testing软件测试网qK+v@7BK| a_

-perm -mode: 文件许可完全符合mode51Testing软件测试网D0gBO!~f&{kz

51Testing软件测试网 _X/G!Is&x1?E_s


c0z9u2w.{03、忽略某个目录51Testing软件测试网V}s1HN h

51Testing软件测试网f8`5@iLV_N

51Testing软件测试网\^3[5vD_M r
如果在查找文件时希望忽略某个目录,因为你知道那个目录中没有你所要查找的文件,那么可以使用-prune选项来指出需要忽略的目录。在使用-prune选项时要当心,因为如果你同时使用了-depth选项,那么-prune选项就会被find命令忽略。

vIMp1O0

4C7c r UHE hb\X?0如果希望在/apps目录下查找文件,但不希望在/apps/bin目录下查找,可以用:51Testing软件测试网"k)b!A9@:Q}

51Testing软件测试网C9q,z,^~U)E


JE QJ*Vs)h0\*F0$ find /apps -path "/apps/bin" -prune -o -print51Testing软件测试网.~ ZP;i kR/?7@(h8J*r

51Testing软件测试网JgJ k[9Llf(m:^+h

51Testing软件测试网,|1R$i6t,a }C
4、使用find查找文件的时候怎么避开某个文件目录

p7S\6e.@a q;\051Testing软件测试网Q L,t m;nC V| ja


y;~x0Ar9W w-QG0比如要在/usr/sam目录下查找不在dir1子目录之内的所有文件

f [*S(j$LI@0\W:T0

7BP h UHT;i0
3p{!m X Z8~0find /usr/sam -path "/usr/sam/dir1" -prune -o -print51Testing软件测试网I'KglK*Lm.I

51Testing软件测试网8}n1Dq0]/sx O


,dV^ _X0find [-path ..] [expression] 在路径列表的后面的是表达式

t)h3Z&cc~"B0

g E6J;Tp9l0-path "/usr/sam" -prune -o -print 是 -path "/usr/sam" -a -prune -o
&`2db.Kx(QO,g0-print 的简写表达式按顺序求值, -a 和 -o 都是短路求值,与 shell 的 && 和 || 类似如果 -path "/usr/sam" 为真,则求值 -prune , -prune 返回真,与逻辑表达式为真;否则不求值 -prune,与逻辑表达式为假。如果 -path "/usr/sam" -a -prune 为假,则求值 -print ,-print返回真,或逻辑表达式为真;否则不求值 -print,或逻辑表达式为真。51Testing软件测试网NP0bQ'o7rq

51Testing软件测试网r#t.{'kzN5Y4R,|fU

这个表达式组合特例可以用伪码写为

.w`g~2D4_7I*C051Testing软件测试网+A Y-Ne:A.X,[s

51Testing软件测试网 p:tpg5e6W
if -path "/usr/sam" then
#X9d!v:V$t/T0          -prune51Testing软件测试网eK%U$k+Pp
else51Testing软件测试网~%M,q;e;`1a8T
          -print51Testing软件测试网%}$ue|QDH4u

51Testing软件测试网-U-N0V O{b6I)h

避开多个文件夹51Testing软件测试网6A*|k#ylQ[?9Vp

51Testing软件测试网'g*|(q$gP/Y"VT^


JK|;}e$ywT,^ Vd0find /usr/sam \( -path /usr/sam/dir1 -o -path /usr/sam/file1 \) -prune -o -print51Testing软件测试网/n9| LGQ

*L"ew1w+h0圆括号表示表达式的结合。

0C1x$n2A0`9Z btX ]k.k0I0H0

gGGNZ7@051Testing软件测试网HOY!A!{8V
\ 表示引用,即指示 shell 不对后面的字符作特殊解释,而留给 find 命令去解释其意义。51Testing软件测试网]!S'?|5nhi

xjKFR/v'?0查找某一确定文件,-name等选项加在-o 之后

7N} mqH _b:E051Testing软件测试网.y{5@~^8H

51Testing软件测试网`L&pZ!~7Z*KX
#find /usr/sam \(-path /usr/sam/dir1 -o -path /usr/sam/file1 \) -prune -o -name "temp" -print

6v|%`REr^.ON0

m u1Y(Z/V c1G051Testing软件测试网;g%d r:MnyI O
5、使用user和nouser选项51Testing软件测试网 cTEN}!fS4wh

uf%W^:A*nB(V#U0
P%]6_lc;oK0按文件属主查找文件,如在$HOME目录中查找文件属主为sam的文件,可以用:

UL:b9n.c,Cs051Testing软件测试网3mODr| lA'~^[%F

51Testing软件测试网dK%bc4d#F W/R,j(Jb
$ find ~ -user sam -print51Testing软件测试网D-Y:AvTC+f2U g3CrgD

51Testing软件测试网8[6U%O g8UE

在/etc目录下查找文件属主为uucp的文件:

#MP&]"|&p/G%R#l9O0

Z7u'c)g6BI:S/e051Testing软件测试网/~jQ%U.r`3lZ/h@;p
$ find /etc -user uucp -print

6V5I;q!kU)hf0

x+q$Aw*z)x.q+T0为了查找属主帐户已经被删除的文件,可以使用-nouser选项。这样就能够找到那些属主在/etc/passwd文件中没有有效帐户的文件。在使用-nouser选项时,不必给出用户名; find命令能够为你完成相应的工作

Tfl&LG'{$[go051Testing软件测试网 ]NY!DNt

例如,希望在/home目录下查找所有的这类文件,可以用:51Testing软件测试网 s||3\ v

y$p7[?!^t.k@051Testing软件测试网z7fz.r-Ob
$ find /home -nouser -print

o-}.G9^ j c5o+cj Hs0

O Op?qULL051Testing软件测试网"X"F)rL2q'bcK
6、使用group和nogroup选项

H,V-HYvbN.mu0

U$eoV|dx'a:U*O0
`TsW/l(u!}0就像user和nouser选项一样,针对文件所属于的用户组, find命令也具有同样的选项,为了在/apps目录下查找属于gem用户组的文件,可以用:51Testing软件测试网+]Q[_X4n8q9mNE

/Fe6]4V| yk0
j j]RU/dLz0$ find /apps -group gem -print

"Z;b"az\%q*t051Testing软件测试网4g&Cc:S%q$S%AB

要查找没有有效所属用户组的所有文件,可以使用nogroup选项。下面的find命令从文件系统的根目录处查找这样的文件51Testing软件测试网(v8y"P-^ Y9k)yoq/Y&}

4s z?'@0b!U0
_~b5|%Xb!E0$ find / -nogroup-print51Testing软件测试网#z,i7C&JSbbU6g

51Testing软件测试网Jp$`B[t7L


yp"IT\*K07、按照更改时间或访问时间等查找文件51Testing软件测试网 X-z cZ/g l d

0t'I+zZ\051Testing软件测试网)F8Q0~ZN.n5L7Y7D2j
如果希望按照更改时间来查找文件,可以使用mtime,atime或ctime选项。如果系统突然没有可用空间了,很有可能某一个文件的长度在此期间增长迅速,这时就可以用mtime选项来查找这样的文件。

|,Cv+u(R$o0

J0U6pi&G"f0用减号-来限定更改时间在距今n日以内的文件,而用加号+来限定更改时间在距今n日以前的文件。51Testing软件测试网4{4S E"Zy2s)K.v

q+\5os.U0C;qN0希望在系统根目录下查找更改时间在5日以内的文件,可以用:

g$oka(|051Testing软件测试网:V!fc9}x'{*y jD:P

51Testing软件测试网:JPw7s+z[ka
$ find / -mtime -5 -print51Testing软件测试网HK MG5t"T&I

%k/|%vX:|%_}0为了在/var/adm目录下查找更改时间在3日以前的文件,可以用:51Testing软件测试网7Kdi4Q"W0v1O

E[3{\B"D?,{ M(TN*{0
d LR2Lu0$ find /var/adm -mtime +3 -print51Testing软件测试网q ?$NR j:s N

51Testing软件测试网\1n ^-O W

51Testing软件测试网*Y e1ED-OO:]'e
8、查找比某个文件新或旧的文件51Testing软件测试网g(UTi D(BY3a_"[

2g%gp,cR.iQ.jk:J5P051Testing软件测试网,N,["^&x\7e3^x*\
如果希望查找更改时间比某个文件新但比另一个文件旧的所有文件,可以使用-newer选项。它的一般形式为:51Testing软件测试网;He-W#?%Lp%w7\F

51Testing软件测试网F8m u.q'?A8s

51Testing软件测试网0l5P4w mv/h:dQKB0m]
newest_file_name ! oldest_file_name51Testing软件测试网5SZ]i.[Xu

!["EcX(h#k/@0其中,!是逻辑非符号。

v1uuL9wkzJ0

(i{(OP6n:M0查找更改时间比文件sam新但比文件temp旧的文件:51Testing软件测试网Kq*V%wmm1@

51Testing软件测试网 Z@.Xm:a'@zOJ

例:有两个文件

O6|s$P2gvV?-hIW051Testing软件测试网F7A%[f*S


Q2q^Df#r0-rw-r--r-- 1 sam adm 0 10月 31 01:07 fiel
k `F3O j(}0-rw-rw-rw- 1 sam adm 34890 10月 31 00:57 httpd1.conf51Testing软件测试网 dYho-W6`a
-rwxrwxr-x 2 sam adm 0 10月 31 01:01 httpd.conf
x2|D#vI2S3YQ3t/z0drw-rw-rw- 2 gem group 4096 10月 26 19:48 sam
&zN/b)q6Y!wHm0-rw-rw-rw- 1 root root 2792 10月 31 20:19 temp51Testing软件测试网?"vv%M$y+M
# find -newer httpd1.conf ! -newer temp -ls
:hu.g&l8KGi01077669 0 -rwxrwxr-x 2 sam adm 0 10月 31 01:01 ./httpd.conf
-TZ;]C | ]t0J8J%F01077671 4 -rw-rw-rw- 1 root root 2792 10月 31 20:19 ./temp51Testing软件测试网jYo%d.\-Q-giB t
1077673 0 -rw-r--r-- 1 sam adm 0 10月 31 01:07 ./fiel51Testing软件测试网:I0|.nebT|"Y(w7h

51Testing软件测试网 r0~.Hdp*[o

查找更改时间在比temp文件新的文件:51Testing软件测试网 B0CF2T pk0oD

51Testing软件测试网)hiTy3Z!qEKD

51Testing软件测试网2t pTK-FY2eg
$ find . -newer temp -print

U3m~3Y:z0fD051Testing软件测试网c B:p,e-V


*yp)n8_8o,u09、使用type选项

'VL!^ U\u Kj:e0

7M2Y-gA7bf"YX&N$_051Testing软件测试网/A i2A(kyZ'QW)NHL3T
在/etc目录下查找所有的目录,可以用:

e']#I3T^0

a2?|X,XTA[TM9o0
eV u&^R0$ find /etc -type d -print

6Y$Gw*j4i5Bay0

0?5qf X$U,|M0在当前目录下查找除目录以外的所有类型的文件,可以用:51Testing软件测试网*SeN%xp*nlx R)h7]

51Testing软件测试网6l!SA)w lv

51Testing软件测试网3s8\.fijdzbK@
$ find . ! -type d -print51Testing软件测试网Bc frq R#oG

51Testing软件测试网P`G$r'a;OC~ d

在/etc目录下查找所有的符号链接文件,可以用

8FBOtzc+O l:\0

b%u R U Q"id051Testing软件测试网E%d-c]6^0|
$ find /etc -type l -print51Testing软件测试网ZoLU@ lh

51Testing软件测试网2Cf;@ aO7Q

51Testing软件测试网!A'`X O3b+Bu g
10、使用size选项

l5q%@)ZSC"~[ R0

)z"^3kx kn r051Testing软件测试网Iz4W Q*E
可以按照文件长度来查找文件,这里所指的文件长度既可以用块(block)来计量,也可以用字节来计量。以字节计量文件长度的表达形式为N c;以块计量文件长度只用数字表示即可。51Testing软件测试网 O w |)s-D3Y!R

51Testing软件测试网v8[z a,|3Z

在按照文件长度查找文件时,一般使用这种以字节表示的文件长度,在查看文件系统的大小,因为这时使用块来计量更容易转换。51Testing软件测试网#p*U"_2gp7xzH3~R
在当前目录下查找文件长度大于1 M字节的文件:51Testing软件测试网` Qrb%u1H

#l]NE(}z]t051Testing软件测试网;u2v iY PM:U(H!FZh
$ find . -size +1000000c -print

!Gm2Q&ZZ3M j6W1r0

1x4aju:k9}!j W0在/home/apache目录下查找文件长度恰好为100字节的文件:

}8r5|`#w H$X0

,_Gk Zi R l0
\7z)\7D$b0$ find /home/apache -size 100c -print51Testing软件测试网$Oq+l$J#Z:r/]@^5E

51Testing软件测试网NEG2RjX

在当前目录下查找长度超过10块的文件(一块等于512字节):

IYJ_PK n1Q051Testing软件测试网:q$N7RW$m

51Testing软件测试网5@c0{i]J
$ find . -size +10 -print51Testing软件测试网 X6D'W([xZ#fv6t;[

)o#`1D$ue)ZMR0
2uEM;HQ9S&V011、使用depth选项

$r&|qp6H9xF051Testing软件测试网~V%qI.@^


7zxy+sPX/s0在使用find命令时,可能希望先匹配所有的文件,再在子目录中查找。使用depth选项就可以使find命令这样做。这样做的一个原因就是,当在使用find命令向磁带上备份文件系统时,希望首先备份所有的文件,其次再备份子目录中的文件。

0oNgyh*EU0

@SK5Ox H-kaJv0在下面的例子中, find命令从文件系统的根目录开始,查找一个名为CON.FILE的文件。51Testing软件测试网~f$yDB*| q%E

$XH9wWz+t(wY1x0它将首先匹配所有的文件然后再进入子目录中查找。

uUf,p'U1O.V^g3?f0

)i6BM!`g#w7R~3N0
6_:I mm^-Xd0$ find / -name "CON.FILE" -depth -print

*F6l7H0AQD"k8`}'R n051Testing软件测试网D;G1e[,^+|4H

51Testing软件测试网Q nU#}_!XdUs
12、使用mount选项

?N+O{Y)_!g051Testing软件测试网6Y {Aw*i?O/A

51Testing软件测试网 g-d#InU.H1k8{
在当前的文件系统中查找文件(不进入其他文件系统),可以使用find命令的mount选项。51Testing软件测试网-xHUi9?T

~SZ7D UJ/zJ0从当前目录开始查找位于本文件系统中文件名以XC结尾的文件:51Testing软件测试网!iUF`%K

51Testing软件测试网-~W&o8Hxy]1j


iDQ h4_Y1P8I"W0$ find . -name "*.XC" -mount -print
0l)z"BtP0 51Testing软件测试网4PXq Atz-t


TAG: 基本知识

 

评分:0

我来说两句

Open Toolbar