Linux 系统之文件查找工具--- locate、 find详解

一、学习Linux为什么要学习文件查找工具?

        作为Linux爱好者,或者Linux运维人员经常会遇到要查找某个或者某一类文件的问题,但对于“一切皆文件”的Linux系统来说,如何能够在成千上万的文件中快速精确的定位到我们所需的文件,对我们来说是至关重要的。因此,熟练掌握并运用Linux系统下的文件查找命令是我们快速定位的关键。

        本文着重介绍Linux环境下的locate、find文件查找工具


二、文件查找工具locate使用详解

    2.1、locate - find files by name 【按名称查找文件】

        locate命令用于查找文件,但比find命令速度快,其工作原理是,是先建立一个包括系统内所有档案名称及路径的索引数据库,之后当查找文件时只是查询的这个索引数据库而并非实际深入档案系统之中,所以它要比find全盘检索要快的多。

        为了达到精确查找的目的也可以通过手动运行:updatedb 来更新其索引数据库,一般第一次使用此命令时比较慢,其数据库保存路径为:/var/lib/mlocate/mlocate.db

    2.2、locate 特点:

        优点:

             查找速度快

        缺点:

            非实时查找---不能精确查找文件状况

            模糊查找-----系统自动按照用户输入关键词的同义词进行模糊检索,从而得出较多的检索结果

    2.3、语法:

        locate [OPTION]... PATTERN...


2.4、主要参数:

        -n 只显示前 n个输出

        -i 查找文件的时候不区分大小写

        -r 使用正规运算式 做寻找的条件

        -e 将排除在寻找的范围之外

        -q 安静模式不会显示任何错误讯息

eg:
查找Linux系统中的passwd文件只显示前5个搜索到的结果
[root@1inux mlocate]# locate -n 5  passwd
/etc/passwd
/etc/passwd-
/etc/pam.d/passwd
/etc/security/opasswd
/lib64/security/pam_passwdqc.so


1、查找/etc/p开头的文件
[root@1inux state]# locate /etc/p
/etc/pam.d
/etc/pango
/etc/passwd
/etc/passwd-
/etc/pcmcia
/etc/pinforc
/etc/pkcs11
/etc/pki
/etc/plymouth
/etc/pm
/etc/pm-utils-hd-apm-restore.conf


三、Linux文件查找工具之find命令

        3.1:search for files in a directory hierarchy---在目录层次结构中搜索文件

            通过遍历指定的目标目录,实时查找符合指定属性的文件;


        3.2、特点:

            优点:

                 精确匹配,文件查找精确度高

            缺点:

                速度慢,由于该命令是通过文件在目录层次结构中搜索文件,所以其速度较慢


        2.3、命令语法:

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

                查找路径:默认为当前路径;

                查找条件:默认为指定路径下的所有文件;

                处理动作:默认为打印至屏幕;

        2.4、查找条件

            2.4.1、查找条件1

              -name "文件名":// 区分文件大小写,并且文件名支持使用globbing    *, ?, [], [^]

eg:
[root@1inux ~]# find /etc -name "passwd"
/etc/passwd
/etc/pam.d/passwd
[root@1inux ~]# find /etc -name "passwd*"
/etc/passwd
/etc/pam.d/passwd
/etc/passwd-


             -iname "文件名"  //不区分文件大小写

eg:
[root@1inux ~]# touch /etc/PASSwd
[root@1inux ~]# find /etc -name "passwd"
/etc/passwd
/etc/pam.d/passwd
[root@1inux ~]# find /etc -iname "passwd"
/etc/passwd
/etc/pam.d/passwd
/etc/PASSwd
[root@1inux ~]#


            -user USERNAME: 根据属主查找

            -group USERNAME: 根据属组查找

eg:
[root@1inux user]# ls -l  /tmp/user
total 0
-rw-r--r-- 1 user1 user1 0 Apr  1 00:44 user1
-rw-r--r-- 1 user2 user2 0 Apr  1 00:44 user2
-rw-r--r-- 1 user3 user3 0 Apr  1 00:44 user3
-rw-r--r-- 1 user4 user4 0 Apr  1 00:44 user4
-rw-r--r-- 1 user5 user5 0 Apr  1 00:44 user5
-rw-r--r-- 1 user6 user6 0 Apr  1 00:44 user6
[root@1inux user]# find /tmp/user -user user1 -exec ls -l {} \;
-rw-r--r-- 1 user1 user1 0 Apr  1 00:44 /tmp/user/user1
[root@1inux user]# find /tmp/user -group user5 -exec ls -l {} \;
-rw-r--r-- 1 user5 user5 0 Apr  1 00:44 /tmp/user/user5
[root@1inux user]#


            -uid UID: 根据指定UID查找;

            -gid GID: 根据指定GID查找;

eg:
[root@1inux user]# tail -2 /etc/passwd
user5:x:1109:1109::/home/user5:/bin/bash
user6:x:1110:1110::/home/user6:/bin/bash
[root@1inux user]# find /tmp/user -uid 1109
/tmp/user/user5
[root@1inux user]# find /tmp/user -gid 1109
/tmp/user/user5
[root@1inux user]#


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

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

[root@1inux user]# userdel user1
[root@1inux user]# ls -l /tmp/user
total 0
-rw-r--r-- 1  1105  1105 0 Apr  1 00:44 user1
-rw-r--r-- 1 user2 user2 0 Apr  1 00:44 user2
-rw-r--r-- 1 user3 user3 0 Apr  1 00:44 user3
-rw-r--r-- 1 user4 user4 0 Apr  1 00:44 user4
-rw-r--r-- 1 user5 user5 0 Apr  1 00:44 user5
-rw-r--r-- 1 user6 user6 0 Apr  1 00:44 user6
[root@1inux user]# find /tmp/user -nouser 
/tmp/user/user1
[root@1inux user]#

            2.4.2、组合查找条件:

                与:-a, 查找条件1 -a 查找条件2 -a ...

所有条件必须同时满足

eg:查找/tmp/user目录下没有属主,且文件名是user3的文件
[root@1inux user]# ls -l
total 0
-rw-r--r-- 1  1105  1105 0 Apr  1 00:44 user1
-rw-r--r-- 1 user2 user2 0 Apr  1 00:44 user2
-rw-r--r-- 1 user3 user3 0 Apr  1 00:44 user3
-rw-r--r-- 1 user4 user4 0 Apr  1 00:44 user4
-rw-r--r-- 1 user5 user5 0 Apr  1 00:44 user5
-rw-r--r-- 1 user6 user6 0 Apr  1 00:44 user6
[root@1inux user]# userdel user3
[root@1inux user]# find /tmp/user -nouser -a -name user3 -exec ls -l {} \;
-rw-r--r-- 1 1107 1107 0 Apr  1 00:44 /tmp/user/user3

                或:-o, 查找条件1 -o 查找条件2 -o ...

满足其中一个条件即可

                非:-not, !   

-not 查找条件


# find /tmp -nouser -a -name "*centos*" -ls
# find /tmp -not \( -name "*.txt" -o -name "*.out" \) // 注意此时括号与字符中间有空格
# find /tmp -not -name "*.txt" -a -not -name "*.out"


            2.4.3、查找条件(2)


                -type TYPE: 根据文件类型查找

f: 普通文件

d: 目录文件

l: 符号链接文件

b: 块设备

c: 字符设备文件

p: 命令名管道文件

s: 套接字文件


                 -size [+|-]#UNIT:

常用单位有:k, M, G


#UNIT: #-1 < x <= #

2k:1.8k, 1.9k, 1.1k

eg:如果查找#=2k的文件:即:-size 2k 实际得到的结果是大于2-1=1k,小于等于2K的所有文件

[root@1inux tmp]# ls -lh
total 88K
drwxr-xr-x  14 root   root   4.0K Mar 29 09:34 aa
-rw-r--r--   1 root   root     51 Mar 27 09:36 aa.txt
-rw-r--r--   1 root   root    936 Mar 29 10:19 fstab
-rw-r--r--   1 root   root     32 Mar 30 01:00 grep.txt
-rw-r--r--   1 root   root    198 Mar 27 10:14 hosts
-rwx------.  1 root   root   1.2K Mar 26 20:52 ks-script-N0tmJ1
-rwxr-xr-x.  1 root   root    346 Mar 26 20:52 ks-script-N0tmJ1.log
-rw-r--r--   1 root   root     46 Mar 27 10:14 network
-rw-r--r--   1 root   root   1.6K Mar 27 09:55 passwd
-rw-r--r--   1 root   root     93 Mar 29 03:28 path
drwx------   2 root   root   4.0K Mar 29 03:49 pulse-SUFCiTfcO22x
-rw-------   1 root   root     80 Mar 27 10:17 qjtTli
-rw-r--r--   1 root   root    154 Apr  1 00:44 userad.sh
-rw-------.  1 root   root      0 Mar 26 20:01 yum.log
[root@1inux tmp]# find /tmp -size 2k -exec ls -lh {} \;
-rw-r--r-- 1 root root 1.6K Mar 27 09:55 /tmp/passwd
-rwx------. 1 root root 1.2K Mar 26 20:52 /tmp/ks-script-N0tmJ1

-#UNIT:x <= #-1

-2k: 1k, 0.9k

eg:如果#=2k,即-size -2k 表示查找的文件小于等于1k

[root@1inux tmp]# find /tmp -size -2k -exec ls -lh {} \;
-rw-r--r-- 1 root root 93 Mar 29 03:28 /tmp/path
-rw-r--r-- 1 root root 936 Mar 29 10:19 /tmp/fstab
-rw------- 1 root root 80 Mar 27 10:17 /tmp/qjtTli
-rw-r--r-- 1 user6 user6 0 Apr  1 00:44 /tmp/user/user6
-rw-r--r-- 1 user5 user5 0 Apr  1 00:44 /tmp/user/user5
-rw-r--r-- 1 user4 user4 0 Apr  1 00:44 /tmp/user/user4


+#UNIT: x > #

+2k: 2.1k, 3.1k

eg:如果k=2,-size +2k,查询到的文件时大于2k的文件

[root@1inux tmp]# find /tmp/ -size +2k -exec ls -lh {} \;
total 88K
drwxr-xr-x  14 root   root   4.0K Mar 29 09:34 aa
drwxrwxr-x   2 centos centos 4.0K Mar 29 15:11 abc
drwxr-xr-x   2 root   root   4.0K Mar 29 09:31 a_c
drwxr-xr-x   2 root   root   4.0K Mar 29 09:31 a_d
drwxr-xr-x   2 root   root   4.0K Mar 29 09:31 b_c
drwxr-xr-x   2 root   root   4.0K Mar 29 09:31 b_d



            2.4.4、根据时间戳查找:天 、分钟、秒

                 以“天”为单位

-atime [+|-]#  //指的是文件最后被读取的时间

#: #= < x < #+1

eg:#=3,即-atime 3表示查找访问文件是第三天访问的文件

-#: x < #

#=3 即-atime -3 表示查找小于3天内访问过的文件

+#: x >= #+1

#=3 即 -atime +3 查找3天以前访问过的文件

-mtime [+|-]#  //指的是文件内容最后被修改的时间  用法同atime

-ctime [+|-]#  // //指的是文件本身最后被变更的时间   用法同atime



以“分钟”为单位用法同上atime

-amin [+|-]#

-mmin [+|-]#

-cmin [+|-]#

eg: 查找五分钟内被修改过的文件:

[root@1inux tmp]# echo test > /tmp/test1
[root@1inux tmp]# find /tmp -amin -5
/tmp
/tmp/test1
[root@1inux tmp]#


根据权限查找:

-perm [+|-]MODE

MODE: 与MODE精确匹配

eg: 查找/tmp目录下权限是644的文件

[root@1inux tmp]# find /tmp -perm 644 -exec ls -l {} \;
-rw-r--r-- 1 user6 user6 0 Apr  1 00:44 /tmp/user/user6
-rw-r--r-- 1 user5 user5 0 Apr  1 00:44 /tmp/user/user5
-rw-r--r-- 1 user4 user4 0 Apr  1 00:44 /tmp/user/user4
-rw-r--r-- 1 1105 1105 3 Apr  1 02:13 /tmp/user/user1
-rw-r--r-- 1 user2 user2 0 Apr  1 00:44 /tmp/user/user2
-rw-r--r-- 1 1107 1107 0 Apr  1 00:44 /tmp/user/user3

                +MODE:任何一类用户的权限只要能包含对其指定的任何一位权限即可;

[root@1inux tmp]# find /tmp -perm +666 -exec ls -l {} \;

total 92

drwxr-xr-x  14 root   root   4096 Mar 29 09:34 aa

-rw-r--r--   1 root   root     51 Mar 27 09:36 aa.txt

drwxrwxr-x   2 centos centos 4096 Mar 29 15:11 abc

drwxr-xr-x   2 root   root   4096 Mar 29 09:31 a_c

drwxr-xr-x   2 root   root   4096 Mar 29 09:31 a_d

drwxr-xr-x   2 root   root   4096 Mar 29 09:31 b_c

drwxr-xr-x   2 root   root   4096 Mar 29 09:31 b_d


                -MODE:每一类用户的权限都包含对其指定的所有权限;


处理动作:

-print: 默认动作,打印至屏幕;

-ls: 显示找到的文件的详细属性;

[root@1inux tmp]# find /etc/p* -ls
393449    4 drwxr-xr-x   2 root     root         4096 Mar 26 20:52 /etc/pam.d
393641    4 -rw-r--r--   1 root     root           71 Nov 22  2013 /etc/pam.d/cvs
393560    4 -rw-r--r--   1 root     root          155 Oct 15 21:14 /etc/pam.d/polkit-1
394967    4 -rw-r--r--   1 root     root          489 Oct 16 05:23 /etc/pam.d/gdm-fingerprint

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

[root@1inux tmp]# find /etc/passwd -exec ls -lh {} \;
-rw-r--r-- 1 root root 2.0K Apr  1 01:12 /etc/passwd

-ok COMMAND {} \;  // 和-exec的作用相同,只不过以一种更为安全的模式来执行该参数所给出的shell命令,在执行每一个命令之前,都会给出提示,让用户来确定是否执行。


注意:find命令会一次性找到所有符合条件的文件,并一同传递给后面的命令;但有些命令不能接受过长的参数;解决办法:


find | xargs COMMAND

本文出自 “无常” 博客,请务必保留此出处http://1inux.blog.51cto.com/10037358/1629183

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。