十五年测试老手,长期负责WEB\APP 项目测试,目前主要负责团队管理工作。

find:根据指定条件查找文件

上一篇 / 下一篇  2010-07-08 16:14:55 / 个人分类:liunx相关

find:根据指定条件查找文件

51Testing软件测试网~D4?a4MkLb

find是一个资深的UNIX®工具。它的功能在于递归扫描一个或多个目录,从中查找匹配指定条件的文件。尽管此工具非常有用,但语法却十分复杂,使用的时候也需要多多练习。最普通的语法是这样的:51Testing软件测试网5xM b1m5^:dU

find [选项] [目录] [条件] [动作]
51Testing软件测试网 |1C"n*izmo*X

如果您不指定任何目录,find将会查找当前目录。如果您不指定条件,则条件相当于“true”,这样会把全部文件都找出来。选项、条件和动作的设置十分繁多,我们在这里只会提到其中的少数几个。首先,让我们来看看着几个选项:

Q!\ Q/|[}4s H-s0
  • onwN_ h m0-xdev:不在其它文件系统的目录中搜索。

    K9] U1E:i M&h0
  • 51Testing软件测试网!u7f:Pp`l

    -mindepth <n>:搜索文件时至少要深入到指定目录的第n层子目录。

    &j8sN`2T0
  • 51Testing软件测试网-A!apR'mK;w

    -maxdepth <n>:搜索文件时最多深入到指定目录的第n层子目录。

    ^f0n1i?%Q+m\0
  • 51Testing软件测试网5h4H^ cf7u{*b9S

    -follow:如果符号链接到目录,则跟随符号链接进入。默认情况下,find不跟随链接。51Testing软件测试网h!a8ykkM5S

  • 51Testing软件测试网sOs0dn8\ `0YJ'|{i

    -daystart:当使用与事件相关的测试时(见下文),将当天的开始时间作为时间戳,而不是默认值(从当前时间倒退24个小时)。

    8H4?gR)X:m?0

W$U I%G9n$R0条件可以是一个或多个原子测试。这是一些有用的测试:

-{.um"|u/\ l zM0
  • $orH{0t5U7j_0-type <文件类型>:搜索给定类型的文件。文件类型可以是以下之一:f(普通文件)、d(目录)、l(符号链接)、s(套接字)、b(块模式文件)、c(字符模式文件)或p(命名管道)。

    -TSU$W v}B8zK.iu0
  • 51Testing软件测试网H|(} x4bEp

    -name <模式>:查找文件名与给定模式匹配的文件。使用此选项,模式将被看作shell 全局模式(参见“Shell 通配符”一节)。51Testing软件测试网?za"a||w.V`

  • 4aj a c#wsa0-iname <模式>:与-name类似,但不区分大小写。

    H,H/E(\ti2U4oo0
  • 51Testing软件测试网;z+o~ q%`

    -atime <n>-amin <n>:查找上次访问时间在n天前(-atime)或n分钟前(-amin) 的文件。您还可以指定<+n><-n>,这代表要搜索访问时间在至多或者至少n天/分钟前的文件。51Testing软件测试网(j$xWh a6@

  • 51Testing软件测试网[(\7zw8_lo

    -anewer <文件>:查找上次访问时间晚于文件的文件。

    )o(?1f@Z4c1Y&~-e0
  • 51Testing软件测试网3H^I1Q+\O g+q&|

    -ctime <n>-cmin <n>-cnewer <file>:与-atime-amin-anewer相同,但比较的是文件上次修改的时间。

    $xL]:bT7`%O0
  • *o ?`7ym&S3o9] p0-regex <模式>:与-name相同,但模式将被看作正则表达式

    mQco H`.wr0c0
  • hu.b"QR#y v0-iregex <pattern>:与-regex相同,但不区分大小写。

    /g:thm zKA*F0
51Testing软件测试网0f y%gg/y!n8]m)@

可供选择的设置还有很多,请参看find(1)中的详情。要进行组合测试,您可以使用以下格式之一:51Testing软件测试网mLFro$t

  • RtU'Eh(u9]0<c1> -a <c2>:如果c1c2都为 true,则结果为 true;-a是隐含的,也就是说如果您想要同时测试c1c2c3三个条件,只需输入<c1> <c2> <c3>51Testing软件测试网%A-iHf/cS'Y"Dl

  • I3GnNH'od2X8?X2R0<c1> -o <c2>:如果 c1 或 c2 中至少有一个是 true,则结果为 true。请注意 -o 的优先级低于 -a,因此如果您想要匹配满足条件 c1 或 c2,且满足 c3  的文件,您就需要使用括号,即( <c1> -o <c2> ) -a <c3>。您还必须对括号进行转码,否则括号将被 shell 加以解释!

    D YnZ#u~"}0
  • 4X,~$`!KR~3o+^0-not <c1>:测试c1的相反结果,因此如果c1是 false 的话,-not <c1>就是 true。51Testing软件测试网 N4K2HbK7[ a({

M;M{C?%w$p0最后,您可以为找到的文件指定一个动作。最常用的有:

`5QK!C H a9K0
  • 51Testing软件测试网$_ VqT2B

    -print:仅仅将每个文件的名称打印在标准输出。这是默认动作。

    8x [1C*QYI0
  • 2e q#v7ua_0-ls:对每个找到的文件以ls -ilds的格式打印在标准输出上。

    TqN_;u'o+P0
  • 51Testing软件测试网&H-a!d w"oo:}*i%n6SS h

    -exec <命令行>:对每个找到的文件依次执行命令行命令行必须以分号(;)结尾,您还必须对其进行转码,以防 shell 对其进行解释;文件位置以{}进行标记。请参看用法的例子。51Testing软件测试网)D6C,K;B p,X@?

  • 7s({2V]9p.n0-ok <命令>:与-exec相同,但对每个命令都请求用户确认。51Testing软件测试网,WwCaN,i'A(n4E\

51Testing软件测试网m.MBg N'E;zR

要理解这些选项和参数最好的方法是执行一些例子。现在,您想要在/usr/share目录中查找全部目录,只需输入:51Testing软件测试网,z\6Eu$B,n

find /usr/share -type d
51Testing软件测试网M2qIn)nOP

假设您有HTTP服务器,而您所有的HTML文件都存在/var/www/html,该目录也是您的当前目录。您想要查找一个月来没有编辑过的全部文件。由于您拥有来自不同作者的页面,所以有些文件的扩展名是html,有些文件的扩展名是htm。您想要将这些文件链接在目录 /var/www/obsolete  中。您应该输入[17]:

%I3N#o#^*Q0@5T6G0
find \( -name "*.htm" -o -name "*.html" \) -a -ctime -30 \
-exec ln {} /var/www/obsolete \;

/J k9[g9{(U%@|cy0这个例子看起来有点复杂,我们会进行详细解释。这里所用的条件是:

4[I8j DX3i g"Tu5f0
\( -name "*.htm" -o -name "*.html" \) -a -ctime -30

rm,p#Jv,?0它所完成的功能正是我们想要的:它会找到文件名以.htm.html\( -name "*.htm" -o -name "*.html" \)” 结尾的文件,而且(-a) 在最近的三十天内没有修改过,这大概是一个月(-ctime -30)。请额外注意括号:这里的括号时必需的,因为-a的优先级较高。如果没有括号的话,将会找到所有以.htm结尾的文件,以及所有一个月以来没有修改过且以.html结尾的文件。这显然不是我们所需要的结果。您还应该注意括号需要在 shell 中加以转码:如果我们写的是( .. ),而不是\( .. \),那么 shell 就会对括号进行解释,并且试图在子 shell 中执行-name "*.htm" -o -name "*.html"……另外一种解决方案是将括号放在双引号或单引号中,但是我们更愿意在此使用反斜线,因为这里只有一个字符。

EJups$e$ps051Testing软件测试网C&im*JcE%t l

最后,还要对每个文件执行这个命令:51Testing软件测试网 _ J gM'r[g

-exec ln {} /var/www/obsolete \;
51Testing软件测试网G5U(^*f3o,oJ+S~6H

这里,您仍然需要对分号(;)进行转码,否则 shell 会将其解释为命令分隔符。如果您忘记了进行转码,find将会抱怨说-exec缺少一个参数。51Testing软件测试网}g RG ze,Fd

v.MTTl ?!L4z0最后一个例子:您有一个非常大的目录(/shared/images),其中包含各种图像。通常,您会使用touch命令更新此目录中名为stamp的文件的时间,这样您就会有一个可参考的时间。您想要找到比 stamp 文件新的所有 JPEG  图像,但是您的图像来源各不相同,文件扩展名有jpgjpegJPG以及JPEG。您还想要不在old目录中搜索。不仅如此,您还想要将此文件列表发送给您,而您的用户名是li_si51Testing软件测试网o.e)kA lJ+b&D*D

find /shared/images -cnewer     \
     /shared/images/stamp       \
     -a -iregex ".*\.jpe?g"     \
     -a -not -regex ".*/old/.*" \
       | mail li_si -s "New images"
51Testing软件测试网`Rh [f9c6l1c

当然,如果您每次都要重复输入的话,这个命令确实没什么用。您可能会想要定时执行该命令。要定时运行命令,最简单的方法就是使用下一节介绍的 cron 守护程序。

VB+c1[_3c_0
51Testing软件测试网5\gDF_[r

51Testing软件测试网X,T9q;k B%b9Q@\

[17] 请注意,这个例子需要 /var/www 和 /var/www/obsolete  在同一个文件系统中!

9uYVBZ+f4] r7|0

TAG: find

 

评分:0

我来说两句

Open Toolbar