一、find命令介绍:

find是一个强大的文件搜索工具,包括目录文件和文本文件,它可以按文件名、文件类型、用户甚至是时间戳查找文件。它还可以找到这些属性任意组合的文件,还可以对它找到的文件执行操作。


二、find命令总解:

(1)基本格式:

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

即  find   [查找路径] [查找条件] [动作]

(2)查找条件:

-name, -iname, -user, -group, -uid, -gid, -nouser, -nogroup, -size, -type, -atime,-mtime,-ctime,-amin,-mmin,-cmin, -perm

(3)执行的动作:

-exec, -ok, -ls,| xargs COMMAND

三、find命令分解:

(1)查找条件:

1.1 -name “文件名称”:按照文件名称查找,可支持使用文件通配符,如*,?,[],[^]。

例如:查找/tmp下面以.txt结尾的文件:


[root@station156 ~]# find /tmp/ -name "*.txt"
/tmp/aa.txt
/tmp/bb.txt

1.2 -iname “文件名称”:查找时不区分字符大小写。

例如:查找/tmp下面以aa.或AA.开头的文件:

[root@station156 ~]# find /tmp/ -iname "aa.*"
/tmp/aa.txt
/tmp/aa.jpg
/tmp/AA.txt
/tmp/aa.doc
/tmp/aa.docx

1.3 -user UserName:查找属主为指定用户的文件。

例如:查找/tmp下面属主是jim用户的文件:

[root@station156 tmp]# find /tmp/ -user jim
/tmp/fstab
[root@station156 tmp]# ll fstab
-rw-r--r-- 1 jim jim 921 Feb 26 15:28 fstab

1.4 -group GroupName:查找属组为某个基本组的用户。

例如:查找/tmp下面属主是fedora用户且属组是fedora基本组的文件:

[root@station156 ~]# find /tmp/ -user fedora -a -group fedora
/tmp/meminfo
/tmp/mounts
[root@station156 ~]# ll /tmp/{meminfo,mounts}
-r--r--r-- 1 fedora fedora 1170 Feb 26 15:30 /tmp/meminfo
-r--r--r-- 1 fedora fedora  896 Feb 26 15:30 /tmp/mounts

说明:组合条件:-a代表并且的意思,即左右2个条件都必须符合;-o代表或者的意思,即左右2个条件有一个符合即可;-not代表非,取反。

1.5 -uid UID:查找uid为指定uid号的用户的文件;-gid:查找gid为指定gid号的基本组的文件。

例如:

   查找uid号为501的用户且gid也为501的用户的文件:

-r--r--r--  1  501  501 1170 Feb 26 15:30 meminfo
-r--r--r--  1  501  501  896 Feb 26 15:30 mounts
-rw-------. 1 root root    0 Feb 18 20:25 yum.log
[root@station156 tmp]# find /tmp/ -uid 501 -a -gid 501
/tmp/meminfo
/tmp/mounts

1.6 -nouser:查找没有属主的文件;-nogroup: 查找没有属组的文件。

例如:查找/tmp/下面没有属主的用户:

-r--r--r--  1  501  501 1170 Feb 26 15:30 meminfo
-r--r--r--  1  501  501  896 Feb 26 15:30 mounts
-rw-------. 1 root root    0 Feb 18 20:25 yum.log
[root@station156 tmp]# find /tmp/ -nouser
/tmp/meminfo
/tmp/mounts

1.7 -type: 根据文件类型查找,文件类型包括:

           f: 普通文件
           d: 目录
           b: 块设备
           c: 字符设备
           l: 符号链接文件
           p: 命名管道
           s: 套接字

例1:查找/tmp/下面文件类型为普通文件且属主不是root的文件:

[root@station156 tmp]# find /tmp/ -type f -a -not -user root
/tmp/meminfo
/tmp/mounts
/tmp/fstab
[root@station156 tmp]# ll /tmp/{meminfo,mounts,fstab}
-rw-r--r-- 1 jim jim  921 Feb 26 15:28 /tmp/fstab
-r--r--r-- 1 501 501 1170 Feb 26 15:30 /tmp/meminfo
-r--r--r-- 1 501 501  896 Feb 26 15:30 /tmp/mounts

例2:查找/etc/下文件类型是符号链接文件或者属组不是root的文件并统计出行数:

[root@station156 tmp]# find /etc/ -type l -o -not  -group root | wc -l
545

1.8 -size: 根据文件大小查找,常用单位是k,M,G。如:5M表示4M至5M之间大小的文件,+5M表示5M以上大小的文件,-5M表示小于4M的文件。

例如:查找/var/log/下面小于1M的文件:

[root@station156 ~]# find /var/log/ -size -1M -ls
1179664    0 -rw-------   1 root     root            0 Feb 18 21:07 /var/log/spooler
1179682    0 -rw-r--r--   1 root     root            0 Feb 18 21:53 /var/log/wpa_supplicant.log
1179681    0 -rw-------   1 root     root            0 Feb 18 21:53 /var/log/spice-vdagent.log
1179651    0 -rw-------   1 root     root            0 Feb 18 20:39 /var/log/tallylog

1.9 根据时间戳查找:

   (1)以天为单位(time):

                           -atime: 访问时间

                           -mtime:修改时间

                           -ctime: 改变时间

   说明:-atime 5:指第5天至第6天之间访问的时间,-atime +5:指第6天之前访问的时间,

         -atime -5:指从现在至第5天访问的时间。

   (2)以分钟为单位(min):
                           -amin :访问时间
                           -mmin :修改时间
                           -cmin :改变时间

例1:查看/tmp/下面修改时间超过1天且不超过2天的文件:

[root@station156 tmp]# find /tmp/ -mtime 1
/tmp/aa.txt
[root@station156 tmp]# date
Wed Feb 26 16:55:38 CST 2014
[root@station156 tmp]# stat aa.txt
  File: `aa.txt'
  Size: 0           Blocks: 0          IO Block: 4096   regular empty file
Device: fd00h/64768d    Inode: 1179656     Links: 1
Access: (0644/-rw-r--r--)  Uid: (    0/    root)   Gid: (    0/    root)
Access: 2014-02-26 15:14:08.008668747 +0800
Modify: 2014-02-25 10:10:00.000000000 +0800
Change: 2014-02-26 16:51:18.847654334 +0800


例2:查找/tmp/下面访问时间并且修改时间超过2天以上的文件:

[root@station156 tmp]# find /tmp/ -atime +1 -a -mtime +1
/tmp/ks-script-tY9s9a
/tmp/ks-script-tY9s9a.log
/tmp/yum.log
[root@station156 tmp]# date
Wed Feb 26 17:05:41 CST 2014
[root@station156 tmp]# stat /tmp/yum.log
  File: `/tmp/yum.log'
  Size: 0           Blocks: 0          IO Block: 4096   regular empty file
Device: fd00h/64768d    Inode: 1179650     Links: 1
Access: (0600/-rw-------)  Uid: (    0/    root)   Gid: (    0/    root)
Access: 2014-02-18 20:25:44.672999949 +0800
Modify: 2014-02-18 20:25:44.672999949 +0800
Change: 2014-02-18 20:25:44.672999949 +0800

例3:查找/tmp/下面访问时间在4分钟以内的文件:

[root@station156 tmp]# find /tmp/ -amin -4
/tmp/fstab
/tmp/201402261710
/tmp/t
[root@station156 tmp]# stat /tmp/fstab
  File: `/tmp/fstab'
  Size: 921         Blocks: 8          IO Block: 4096   regular file
Device: fd00h/64768d    Inode: 1179662     Links: 1
Access: (0644/-rw-r--r--)  Uid: (  500/     jim)   Gid: (  500/     jim)
Access: 2014-02-26 17:15:12.762648630 +0800
Modify: 2014-02-26 15:28:49.136660496 +0800
Change: 2014-02-26 17:15:12.762648630 +0800
[root@station156 tmp]# date
Wed Feb 26 17:19:02 CST 2014

2.0  -perm:根据权限查找。

           -perm  +644:表示任何用户只要有其中的任何一项权限就行,+644表示属主有读或者写的权限,或者属组有读的权限,或者其它用户有读的权限。            

           “+”在这里是或者的意思。

           -perm -644:表示每类用户的指定要检查的权限位都匹配,-644表示属主必须有读和写的权限,并且属组有读的权限,并且其它用户有读的权限。

           “-”在这里是并且的意思。


例1:查找/etc/目录所有用户都没有写权限的文件:

[root@station156 ~]# find /etc/ -not -perm +222 -exec ls -l {} \;
-r-xr-xr-x. 1 root root 2134 Feb 22  2013 /etc/rc.d/init.d/lvm2-lvmetad
-r-xr-xr-x. 1 root root 1340 Feb 22  2013 /etc/rc.d/init.d/blk-availability
-r-xr-xr-x. 1 root root 2665 Feb 22  2013 /etc/rc.d/init.d/lvm2-monitor
-r--r--r--. 1 root root 324 Feb 22  2013 /etc/ld.so.conf.d/kernel-2.6.32-358.el6.x86_64.conf

说明:-not -perm +222 相当于 非(A或B或C)=非A且非B且非C

例2:查找/etc/目录下至少有一类用户没有写权限:

[root@station156 ~]# find /tmp/ -not -perm -222 -exec ls -l {} \;
-r--r--r-- 1 501 501 1170 Feb 26 15:30 /tmp/meminfo
-rwx------. 1 root root 1182 Feb 18 21:52 /tmp/ks-script-tY9s9a
-rwxr-xr-x. 1 root root 346 Feb 18 21:52 /tmp/ks-script-tY9s9a.log
-rw-------. 1 root root 0 Feb 18 20:25 /tmp/yum.log
-rw-r--r-- 1 root root 0 Feb 25 10:10 /tmp/aa.txt
-r--r--r-- 1 501 501 896 Feb 26 15:30 /tmp/mounts
-rw-r--r-- 1 root root 0 Feb 26 15:14 /tmp/aa.jpg
-rw-r--r-- 1 root root 0 Feb 26 15:21 /tmp/AA.txt

说明:-not -perm -222 相当于: 非(A且B且C)= 非A或非B或非C


(2)处理的动作:

 1.1 -ls:以长格式输出各文件信息。

例如:查找/tmp/下最近1天内其内容修改过的且不属于root或jim用户的文件,并以长格式显示出来:


[root@station156 ~]# find /tmp/ -mtime -1 -a -not \( -user root -o -user jim \) -ls
1179667   20 -rw-r--r--   1 hadoop   hadoop      18216 Feb 26 18:03 /tmp/kkk
1179664    4 -r--r--r--   1 hadoop   hadoop       1170 Feb 26 15:30 /tmp/meminfo
1179663    4 -r--r--r--   1 hadoop   hadoop        896 Feb 26 15:30 /tmp/mounts
[root@station156 ~]# stat /tmp/kkk
  File: `/tmp/kkk'
  Size: 18216       Blocks: 40         IO Block: 4096   regular file
Device: fd00h/64768d    Inode: 1179667     Links: 1
Access: (0644/-rw-r--r--)  Uid: (  501/  hadoop)   Gid: (  501/  hadoop)
Access: 2014-02-26 18:03:52.514642842 +0800
Modify: 2014-02-26 18:03:52.514642842 +0800
Change: 2014-02-26 18:03:52.514642842 +0800
[root@station156 ~]# date
Wed Feb 26 18:06:40 CST 2014

1.2 -exec COMMAND {} \; :对查找到的文件执行指定的命令。“{}”代表前面find所查找到的文件。    

例如:查找/tmp/下文件类型是普通文件且属主是jim的文件,并显示文件中的内容:

[root@station156 ~]# find /tmp/ -type f -a -user jim -exec cat {} \;
#
# /etc/fstab
# Created by anaconda on Tue Feb 18 20:26:51 2014
#
# Accessible filesystems, by reference, are maintained under '/dev/disk'
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
#
/dev/mapper/vg0-root    /                       ext4    defaults        1 1
UUID=041d4189-4001-463d-a3d1-4e07cc718989 /boot                   ext4    defaults        1 2
/dev/mapper/vg0-usr     /usr                    ext4    defaults        1 2
/dev/mapper/vg0-var     /var                    ext4    defaults        1 2
/dev/mapper/vg0-swap    swap                    swap    defaults        0 0
tmpfs                   /dev/shm                tmpfs   defaults        0 0
devpts                  /dev/pts                devpts  gid=5,mode=620  0 0
sysfs                   /sys                    sysfs   defaults        0 0
proc                    /proc                   proc    defaults        0 0

1.3 -ok COMMAND {} \; : 交互式的-exec。

1.4 find | xargs COMMAND :把find所查找到的文件通过管道的方式给后面的xargs来执行命令操作。

例如:把/tmp/下面文件类型是文本文件且属主是jim的文件的属主、属组和其它用户的权限都改为只读:

[root@station156 tmp]# find /tmp/ -type f -a -user jim | xargs chmod 444
[root@station156 tmp]# ll /tmp/fstab
-r--r--r-- 1 jim jim 921 Feb 26 15:28 /tmp/fstab


四、find命令后语:

   find命令可以实时并精确地查找文件,方便linux运维工程师的日常工作,但它非常的消耗资源,会使得系统性能下降,所以我们尽量把它放在后台执行,或是小范围的查找。