首页 > 代码库 > find文件查找

find文件查找

grep、egrep、fgrep这些指令称为文本查找,即在给定的文本中找出匹配的内容。

而文件查找则是查找系统中的指定的文件是否存在,这些指令有locate和find。


locate:非实时查找,模糊匹配,根据数据库的内容进行搜索,搜索速度较快。

如果要生成或更新locate所使用的数据库的话,可以用updatedb这个指令。


find:是实时、精确查找,支持众多的条件,使用范围较广。

find语法格式:
find 查找路径  查找标准  查找到以后的处理动作
说明:
查找路径:默认为当前目录。
查找标准:默认为制定路径下的所有文件。
处理动作:默认为显示。

示例1:

[root@Server3 tmp]# find
.
./.esd-0
./.esd-0/socket
./.ICE-unix
[root@Server3 tmp]#
匹配标准:
-name ‘filename‘:根据文件名查找,精确查找。区分大小写。
-iname ‘filename‘:文件名匹配不区分大小写。
    文件名通配符:
     *:匹配任意长度的任意字符。
     ?:匹配任意一个字符。
     []:匹配括号中的任意一个字符。
示例2:
[root@Server3 tmp]# find /etc -name passwd 
/etc/pam.d/passwd
/etc/passwd
[root@Server3 tmp]# 

示例3:
[root@Server3 tmp]#  find /etc -name ‘*shadow‘
/etc/gshadow
/etc/shadow
[root@Server3 tmp]# 

-user:根据文件的拥有者进行查找。
-group:根据文件的属组进行查找。
-uid:根据uid查找。
-gid:根据gid查找。
-nouser:查找没有属主的文件。
-nogroup:查找没有属组的文件。

示例4:
[root@Server3 tmp]# find /home -user frame
/home/frame
/home/frame/.bash_logout
/home/frame/.viminfo
/home/frame/.bash_profile
/home/frame/.bashrc
/home/frame/.bash_history
/home/frame/.mozilla
/home/frame/.mozilla/plugins
/home/frame/.mozilla/extensions
/home/frame/.gnome2
[root@Server3 tmp]# 

示例5:
[root@Server3 tmp]# find /home -uid 500
/home/xguest
/home/xguest/.bash_logout
/home/xguest/.bash_profile
/home/xguest/.bashrc
/home/xguest/.bash_history
/home/xguest/.mozilla
/home/xguest/.mozilla/plugins
/home/xguest/.mozilla/extensions
/home/xguest/.gnome2
[root@Server3 tmp]# 


-type:根据文件类型查找。
    f:普通文件
    d:目录
    b:块设备文件
    c:字符设备文件
    s:socket文件
    p:pipe管道文件
    l:链接文件

示例6:
[root@Server3 keepalived-1.1.17]# find /dev -type s
/dev/log
[root@Server3 keepalived-1.1.17]# ls -l /dev/log 
srw-rw-rw- 1 root root 0 Jul 12 14:52 /dev/log
[root@Server3 keepalived-1.1.17]# 

-size [[+-]nk|M|G]:根据文件大小查找。如果没有跟上大小,则默认单位为字节。+:表示大于指定的单位,-:表示小于指定大小的文件。

示例7:
[root@Server3 keepalived-1.1.17]# find / -size +1G -ls
534397 3593220 -rw-r--r--   1 root     root     3679453184 May 11 15:36 /opt/rhel6.3x64.iso
[root@Server3 keepalived-1.1.17]# 

组合条件:
    -a:与
    -o:或
    -not:非
    如果指定了多个找到文件,但是没有指定组合条件,则默认为-a。

示例8:
[root@Server3 ~]# find /home -type d -a -user frame
/home/frame
/home/frame/.mozilla
/home/frame/.mozilla/plugins
/home/frame/.mozilla/extensions
/home/frame/.gnome2
[root@Server3 ~]# find /home -type d -user frame
/home/frame
/home/frame/.mozilla
/home/frame/.mozilla/plugins
/home/frame/.mozilla/extensions
/home/frame/.gnome2
[root@Server3 ~]# 

-mtime [[+-]n]:修改时间,文件内容被修改
-ctime [[+-]n]:改变时间,文件属性被修改
-atime [[+-]n]:访问时间,文件被查看
上述n为天数。

-mmin [[+-]n]
-cmin [[+-]n]
-amin [[+-]n]
上述n表示的是分钟。

+n     for greater than n
-n     for less than n
n      for exactly n
说明:如果时间为+5,则表示5天/分钟前。如果为-5,则表示5天/分钟内,如果为5,则表示第五天/分钟这一天。

-perm MODE:根据文件的权限匹配。确切的匹配权限,必须为指定的权限。
-perm -MODE:mode中的所有权限位都必须要设置才满足条件。
-perm /MODE:mode中的任何一个权限位被设置都满足条件。


find的动作
-print:默认的动作。
-ls:类似于ls -l的形式显示每一个文件的详细信息。
-ok COMMAND {} \; :要执行的动作,和-exec一样的。{}表示引用找到的文件。\;结束符,为固定格式。
-exec COMMAND {} \; :要执行的动作。

示例:
[root@Server3 tmp]# find ./ -perm 640 -ls
541403    0 -rw-r-----   1 root     root            0 Jul 12 16:00 ./a
[root@Server3 tmp]#
说明:第一个为inode号(541403)。第二个(0)为文件的大小。剩下的就和ls -l一样了。

[root@Server3 tmp]# find ./ -perm 640 -ok chmod 644 {} \;
< chmod ... ./a > ? y
[root@Server3 tmp]# ls -l a
-rw-r--r-- 1 root root 0 Jul 12 16:00 a
[root@Server3 tmp]# 

[root@Server3 tmp]# ls -l a
-rw-r----- 1 root root 0 Jul 12 16:00 a
[root@Server3 tmp]# find ./ -perm 640 -exec chmod 644 {} \;
[root@Server3 tmp]# ls -l a
-rw-r--r-- 1 root root 0 Jul 12 16:00 a
[root@Server3 tmp]# 

说明:-ok和-exec的区别是,-ok需要对每一个动作进行确认,-exec不需要确认。







本文出自 “HeZhang” 博客,请务必保留此出处http://hezhang.blog.51cto.com/1347601/1437511