Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2323052
  • 博文数量: 535
  • 博客积分: 8689
  • 博客等级: 中将
  • 技术积分: 7066
  • 用 户 组: 普通用户
  • 注册时间: 2010-11-26 10:00
文章分类

全部博文(535)

文章存档

2024年(4)

2023年(4)

2022年(16)

2014年(90)

2013年(76)

2012年(125)

2011年(184)

2010年(37)

分类: LINUX

2012-05-27 15:11:17


 

 

 

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

 

find [选项] [目录] [条件] [动作]

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

 

-xdev:不在其它文件系统的目录中搜索。

 

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

 

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

 

-follow:如果符号链接到目录,则跟随符号链接进入。默认情况下,find 不跟随链接。

 

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

 

条件可以是一个或多个原子测试。这是一些有用的测试:

 

-type <文件类型>:搜索给定类型的文件。文件类型可以是以下之一:f(普通文件)d(目录)l(符号链接)s(套接字)b(块模式文件)c(字符模式文件)p(命名管道)

 

-name <模式>:查找文件名与给定模式匹配的文件。使用此选项,模式将被看作shell 全局模式(参见“Shell 通配符”一节)

 

-iname <模式>:与 -name 类似,但不区分大小写。

 

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

 

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

 

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

 

-regex <模式>:与 -name 相同,但模式将被看作正则表达式。

 

-iregex :与 -regex 相同,但不区分大小写。

 

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

 

-a :如果 c1 c2 都为 true,则结果为 true-a 是隐含的,也就是说如果您想要同时测试 c1c2 c3 三个条件,只需输入

 

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

 

-not :测试 c1 的相反结果,因此如果 c1 false 的话,-not 就是 true

 

最后,您可以为找到的文件指定一个动作。最常用的有:

 

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

 

-ls:对每个找到的文件以 ls -ilds 的格式打印在标准输出上。

 

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

 

-ok <命令>:与 -exec 相同,但对每个命令都请求用户确认。

 

要理解这些选项和参数最好的方法是执行一些例子。现在,您想要在 /usr/share 目录中查找全部目录,只需输入:

 

find /usr/share -type d

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

 

find \( -name "*.htm" -o -name "*.html" \) -a -ctime -30 \

-exec ln {} /var/www/obsolete \;

这个例子看起来有点复杂,我们会进行详细解释。这里所用的条件是:

 

\( -name "*.htm" -o -name "*.html" \) -a -ctime -30

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

 

最后,还要对每个文件执行这个命令:

 

-exec ln {} /var/www/obsolete \;

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

 

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

 

find /shared/images -cnewer     \

     /shared/images/stamp       \

     -a -iregex ".*\.jpe?g"     \

     -a -not -regex ".*/old/.*" \

       | mail li_si -s "New images"

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

 

 

 

 

 

Linuxfind常见用法示例·

find    path    -option    [    -print ]    [ -exec    -ok    command ]    {} \;

#-print 将查找到的文件输出到标准输出

#-exec    command    {} \;       -----将查到的文件执行command操作,{} \;之间有空格

#-ok -exec相同,只不过在操作前要询用户

-name    filename               #查找名为filename的文件

-perm                         #按执行权限来查找

-user     username              #按文件属主来查找

-group groupname              #按组来查找

-mtime    -n +n                 #按文件更改时间来查找文件,-nn天以内,+nn天以前

-atime     -n +n                #按文件访问时间来查GIN: 0px">-perm                          #按执行权限来查找

-user     username              #按文件属主来查找

-group groupname              #按组来查找

-mtime    -n +n                 #按文件更改时间来查找文件,-nn天以内,+nn天以前

-atime     -n +n                #按文件访问时间来查找文件,-nn天以内,+nn天以前

-ctime     -n +n                #按文件创建时间来查找文件,-nn天以内,+nn天以前

-nogroup                      #查无有效属组的文件,即文件的属组在/etc/groups中不存在

-nouser                       #查无有效属主的文件,即文件的属主在/etc/passwd中不存

-newer    f1 !f2                找文件,-nn天以内,+nn天以前

-ctime     -n +n                #按文件创建时间来查找文件,-nn天以内,+nn天以前

-nogroup                      #查无有效属组的文件,即文件的属组在/etc/groups中不存在

-nouser                       #查无有效属主的文件,即文件的属主在/etc/passwd中不存

-newer    f1 !f2                #查更改时间比f1新但比f2旧的文件

-type      b/d/c/p/l/f          #查是块设备、目录、字符设备、管道、符号链接、普通文件

-size       n[c]                #查长度为n[n字节]的文件

-depth                        #使查找在进入子目录前先行查找完本目录

-fstype                       #查更改时间比f1新但比f2旧的文件

-mount                        #查文件时不跨越文件系统mount

-follow                       #如果遇到符号链接文件,就跟踪链接所指的文件

-cpio                         #对匹配的文件使用cpio命令,将他们备份到磁带设备中

-prune                        #忽略某个目录

更多信息可以查看Linuxfind命令详解》、《Linuxfind命令实例》

 

1)/tmp中查找所有的*.h并在这些文件中查找SYSCALL_VECTOR"最后打印出所有包含"SYSCALL_VECTOR"的文件名

A) find    /tmp    -name    "*.h"    | xargs    -n50    grep SYSCALL_VECTOR

B) grep    SYSCALL_VECTOR    /tmp/*.h | cut     -d':'    -f1| uniq > filename

C) find    /tmp    -name "*.h"    -exec grep "SYSCALL_VECTOR"    {}    \; -print

 

2)find / -name filename -exec rm -rf {} \;

     find / -name filename -ok rm -rf {} \;

 

3)比如要查找磁盘中大于3M的文件:

find . -size +3000k -exec ls -ld {} ;

 

4)find出来的东西拷到另一个地方

find *.c -exec cp '{}' /tmp ';'

如果有特殊文件,可以用cpio,也可以用这样的语法:

find dir -name filename -print | cpio -pdv newdir

 

6)查找2004-11-30 16:36:37时更改过的文件

# A=`find ./ -name "*php"` |    ls -l --full-time $A 2>/dev/null | grep "2004-11-30 16:36:37

二、linuxfind命令的用法1. 基本用法:

      find / -name 文件名

     find ver1.d ver2.d -name '*.c' -print    查找ver1.d,ver2.d *.c文件并打印

     find . -type d -print 从当前目录查找,仅查找目录,找到后,打印路径名。可用于打印目录结构。

2. 无错误查找:

      find / -name access_log 2 >/dev/null

3. 按尺寸查找:

      find / -size 1500c (查找1,500字节大小的文件,c表示字节)

      find / -size +1500c (查找大于1,500字节大小的文件,+表示大于)   

      find / -size +1500c (查找小于1,500字节大小的文件,-表示小于)   

4. 按时间:

      find / -amin n 最后n分钟

      find / -atime n 最后n

      find / -cmin n 最后n分钟改变状态

      find / -ctime n 最后n天改变状态

5. 其它:

      find / -empty 空白文件、空白文件夹、没有子目录的文件夹

      find / -false 查找系统中总是错误的文件

      find / -fstype type 找存在于指定文件系统的文件,如typeext2

      find / -gid n idn的文件

      find / -group gname 组名为gname的文件

      find / -depth n 在某层指定目录中优先查找文件内容

      find / -maxdepth levels 在某个层次目录中按递减方式查找

6. 逻辑

      -and 条件与 -or 条件或

7. 查找字符串

      find . -name '*.html' -exec grep 'mailto:'{}

阅读(1027) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~