Linux之文件查找命令locate与find详解

一,文件查找

文件查找就是在文件系统上查找符号条件的文件

文件查找可以通过使用locate和find命令

 locate :非实时查找(数据库查找)

 find :实时查找

locate命令

查询系统上预建的文件索引数据库 : /var/lib/mlocate/mlocate.db

依赖于事先构建的索引

索引是构建在系统较为空闲时自动进行(周期性任务);管理员可以通过 updatedb 手动更新数据库

索引构建过程中需要遍历整个根文件系统,极其消耗资源

工作特点:

查找速度快

模糊查找

非实时查找

搜索的是文件的全路径,不仅仅是文件名

可能只搜索用户具备读取和执行权限的目录

语法:

locate KEYWORK

 -i :执行区分大小写的搜索

 -n X :只列举前X个匹配项目

比如:locate nine  :搜索名称或路径中带有 nine 的文件

locate -r '\.sh$'

 使用Regex来搜索以 ".sh"结尾的文件

blob.png


find命令

find是实时查找工具,通过遍历指定路径完成文件查找

工作特点

查找速度略慢

精确查找

实时查找

可能只搜索用户具备读取和执行权限的目录

语法:

find [OPTION]… [查找路径] [查找条件] [处理动作] 

 查找路径 :指定具体目标路径,默认为当前目录

 查找条件 :指定的查找标准,可以通过文件名,大小,类型,权限等标准进行,默认为找出指定路径下的所有文件

 处理动作 :对符合条件的文件做操作,默认输出值屏幕

1,通过文件名和inode查找

 -name filename :支持使用glob *,?,[],[^]等

 -iname filename :不区分字母大小写

 -inum n :按inode号查找

 -samefile name :相同inode号的文件

 -links n :连接数为n的文件

 -regex "PATTERN" :以PATTERN匹配整个文件路径字符串,而不仅仅是文件名称

2,通过属主,属组查找

 -user USERNAME :查找属主位指定用户(UID)的文件

 -group GROUPNAME :查找数组位指定组(GID)的文件

 -uid UserID :查找属主为指定的UID号的文件

 -gid GroupID :查找属组为指定的GID号的文件

 -nouser :查找没有属主的文件

 -nogroup :查找没有属组的文件

3,根据文件类型查找

-type TYPE:

 f :普通文件

 d :目录文件

 l :符号链接文件

 s :套接字文件

 b :块设备文件

 c :字符设备文件

 p :管道文件

4,组合条件查找

与 : -a

或 : -o

非 : -not , !

德摩根定律:

 

非(P 且 Q) = (非 P) 或 (非 Q) 

非(P 或 Q) = (非 P) 且 (非 Q)

!A -a !B = !(A -o B) 

!A -o !B = !(A -a B)

比如:

find / -name che.sh              #搜索名为che.sh的文件
find -iname che.sh               #不区分大小写搜索文件
find / -name *.txt               #搜索后缀为.txt的文件
find -user nineven -group cent         #搜索被用户nineven 以及组群cent所拥有的文件
find -user cent -not -group root        #搜索属于用户cent并且不属于root组的文件
find -user root -o -user nineven       #搜索属于root用户或者nineven用户的文件
find -not \( -user root -o -user cent \)    #搜索不属于root用户也不属于cent用户的文件

找出/tmp目录下,属主不是root,且文件名不是fstab的文件 

[root@centos7 Desktop]# find /tmp \( -not -user root -not -name 'fstab'  \) -ls    #方法一
[root@centos7 Desktop]# find /tmp -not \( -user root -o -name 'fstab'  \) -ls      #方法二
103812749    0 srwxrwxrwx   1 gdm      gdm             0 Aug  8 12:48 /tmp/.ICE-unix/2065
103813790    0 srwxrwxrwx   1 gdm      gdm             0 Aug  8 16:17 /tmp/.ICE-unix/2751
103813763    0 srwxrwxrwx   1 cent     cent            0 Aug  8 19:41 /tmp/.ICE-unix/15068

排除目录 

find /etc -path ‘/etc/sane.d’ -a -prune -o -name *.conf -print

5,根据文件大小来查找

  -size [+|-]#UNIT

常用单位: k,M,G

 # : (#-1,#] ,如 :8k

 -# : [0,#-1] ,如 :-8k

 +# : (#,∞) ,如 :+8k

注意:文件大小查找时是按照字节大小来进行查找的

6,根据时间戳查找

以 '天'为单位:

 -atime [+|-]#  :访问时间

 -mtime [+|-]#  :修改时间

 -ctime [+|-]#  :改变时间

    #: [#,#+1) 

    +#: [#+1,∞] 

    -#: [0,#) 

以“分钟”为单位: 

 -amin 

 -mmin 

 -cmin

7,根据权限查找:

-perm [/|-]MODE

 MODE :精确权限匹配

 /MODE :任何一类(u,g,o)对象的权限中只要能有一位匹配即可,是或的关系

 -MODE :每一类对象都必须同时拥有指定权限,是与的关系

 0 :表示不关注

比如:

find -perm 755  #只匹配权限模式恰好是755的文件
find -perm /222  #匹配任意人有写的权限,意思是只有文件有写的权限,就能匹配到
find -perm -222  #只有当每个人都有写权限才能匹配到
find -perm -002  #只有其他人(other)有写的权限时才会匹配到

8,处理动作:

 -print :默认的处理动作,显示至屏幕

 -ls :类似于对查找到的文件执行 "ls -l" 命令

 -delete :删除查找到的文件

 -fls file :查找到的所有文件的长格式信息保存至指定文件中

 -ok COMMAND {} \;  :对查找到的每个文件执行有COMMAND指定的命令,对于每个文件执行命令前,都会交互式要求用户确认

 -exec COMMAND {} \;  :对查找到的每个文件执行由COMMAND指定的命令

 {} :由于引用找到的文件名称自身

find传递查找到的文件至后面指定命令时,查找到所有符合条件的文件一次性传递给后面的命令有些命令不能接受过的的参数,此时命令执行可能会失败,下面方式可避免此问题

find | xargs COMMAND

比如:

find -name "*.sh" -exec cp {} {}.bak \;     #备份本目录下所有 .sh 结尾的文件,添加.bak这个扩展名

blob.png

find /tmp -ctime +3 -user cent -ok rm {} \;  #提示删除存在时间超过3天以上的cent的临时文件

blob.png

find命令参数
参数 详情
根据文件名和inode查找
 -name    "filename" 支持使用glob通配符
 -iname "filename" 不区分字母大小写
 -inum n 按inode号查找
 -samefile name 相同inode号的文件
 -links n 链接数文n的文件
 -regex "PATTERN" 以PATTERN匹配整个文件路径字符串,而不仅仅是文件名称
根据属主属组查找
 -user USERNAME 查找属主为指定用户的文件
 -group GROUPNAME 查找属组为指定组的文件
 -uid UserID 查找属主为指定UID号的文件
 -gid GroupID 查找属组为指定GID号的文件
 -nouser 查找没有属主的文件
 -nogroup 查找没有属组 的文件
按文件类型查找
 -type f 普通文件
 -type d 目录文件
 -type l 符号链接文件
 -type s 套接字文件
 -type b 块设备文件
 -type c 字符设备文件
 -type p 管道文件
根据文件大小来查找
 -size [+|-]#UNIT UNIT常用单位:k,M,G
 #UNIT  (#-1 ,3]  
 -#UNIT  [0,#-1]
 +#UNIT  (#,∞)
根据文件时间戳查找
以天为单位
 -atime [+|-]# 访问时间
 -mtime [+|-]# 修改时间
 -ctime    [+|-]# 改变时间
以分钟为单位
 -amin [+|-]# 访问时间
 -mmin [+|-]# 修改时间
 -cmin [+|-]# 改变时间
 #  [#,#+1)
 +#  [#+1,∞]
 -#  [0,#)
根据权限查找
 -perm [/|-]MODE
 MODE 精确权限匹配
 /MODE 任何一类(u,g,o)对象的权限中只要有一位匹配即可,或关系
 -MODE 每一类对象都必须同时拥有指定权限,与关系
  0 表示不关注
条件组合
 -a and,与
 -o or,或
 -not , !
!A -a !B = !(A -o B)  非(A 或 B) = (非 A) 且 (非 B)
!A -o !B = !(A -a B) 非(A 且 B) = (非 A) 或 (非 B) 


实战训练:

1、查找/var目录下属主为root,且属组为mail的所有文件 

[root@centos7 Desktop]# find /var -user root -group mail
/var/spool/mail
/var/spool/mail/root

2、查找/var目录下不属于root、lp、gdm的所有文件 

[root@centos7 Desktop]# find /var -not \( -user root  -o -user lp -o -user gdm \) -ls
34489031    0 drwxrwx---   3 ods      ods            19 Jul 21 11:27 /var/lib/softhsm
68414830    0 drwxrwx---   2 ods      ods             6 Nov 20  2015 /var/lib/softhsm/tokens
1191529    0 drwx------   2 sssd     sssd            6 Nov 20  2015 /var/lib/sss/db
34612192    0 drwxr-xr-x   2 sssd     sssd            6 Nov 20  2015 /var/lib/sss/gpo_cache

3、查找/var目录下最近一周内其内容修改过,同时属主不为 root,也不是postfix的文件

[root@centos7 Desktop]# find /var  -mtime -7 -not \( -user root -o -user postfix \) -ls
 10659    4 -rw-r--r--   1 gdm      gdm            43 Aug 13 15:25 
103813776    0 -rw-rw----   1 liuyu    mail            0 Aug 11 17:30 /var/spool/mail/liuyu
103813780    0 -rw-rw----   1 xixi     mail            0 Aug 11 17:31 /var/spool/mail/xixi
106825848    0 -rw-rw----   1 xi       mail            0 Aug 11 17:33 /var/spool/mail/xi
106840464    0 -rw-rw----   1 1005     mail            0 Aug 12 20:34 /var/spool/mail/user01

4、查找当前系统上没有属主或属组,且最近一个周内曾被访 问过的文件 

[root@centos7 Desktop]# find / -nouser -nogroup -atime -7 -ls
106840424    0 drwx------   3 1005     1005           74 Aug 12 20:34 /home/user01
  9574    0 drwxr-xr-x   4 1005     1005           37 Jul 21 11:23 /home/user01/.mozilla
33588923    0 drwxr-xr-x   2 1005     1005            6 Jun 10  2014 /home/user01/.mozilla/extensions
72866696    0 drwxr-xr-x   2 1005     1005            6 Jun 10  2014 /home/user01/.mozilla/plugins
106840459    4 -rw-r--r--   1 1005     1005           18 Nov 20  2015 /home/user01/.bash_logout
106840462    4 -rw-r--r--   1 1005     1005          193 Nov 20  2015 /home/user01/.bash_profile
106840463    4 -rw-r--r--   1 1005     1005          231 Nov 20  2015 /home/user01/.bashrc

5、查找/etc目录下大于1M且类型为普通文件的所有文件 

[root@centos7 Desktop]# find /etc -type f -size +1M -ls
106733216 6852 -r--r--r--   1 root     root      7014922 Jul 21 11:48 /etc/udev/hwdb.bin
102496255 3772 -rw-r--r--   1 root     root      3858924 Nov 21  2015 /etc/selinux/targeted/policy/policy.29
69884684 1336 -rw-r--r--   1 root     root      1367395 Mar  6  2015 /etc/brltty/zh-tw.ctb

6、查找/etc目录下所有用户都没有写权限的文件 

[root@centos7 Desktop]# find /etc/  -not    -perm  /222 -ls

blob.png

7、查找/etc目录下至少有一类用户没有执行权限的文件 

find /etc -not -perm -111 -ls

8、查找/etc/init.d目录下,所有用户都有执行权限,且其它 用户有写权限的文件

find /etc/init.d/ -perm -113

类似文章