linux学习24 Linux运维必备技能-文件查找命令企业级应用

一、文件查找

  1、在文件系统上查找符合条件的文件

    实现工具:locate,find

  2、locate

    a、依赖于事先构建好的索引库;

      系统自动实现(周期性任务)

      手动更新数据库(updatedb),此操作非常消耗系统资源

    b、工作特性

      查找速度快

      模糊查找

      非实时查找

    c、相应参数

      -b:只匹配路径中的基名,不包含路径

      -c:统计出共有多少个符合条件的文件

      -r:BRE

  3、find

    a、实时查找工具,通过遍历指定起始路径下文件系统层级结构完成文件查找

    b、工作特性

      查找速度略慢

      精确查找

      实时查找

    c、用法

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

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

        查找条件:指定的查找标准,可以根据文件名,大小,类型,从属关系,权限等等标准进行;默认为找出指定路径下的所有文件;

        处理动作:对符合查找条件的文件作出的操作,例如删除等操作,默认为输出至标准输出

    d、查找条件

      表达式:选项和测试

      测试:

        (1)、根据文件名查找:

          -name "pattern"

[root@node1 ~]# find /etc -name "passwd"
/etc/passwd
/etc/pam.d/passwd

          -iname "pattern" :忽略名称中的大小写

[root@node1 ~]# find /etc -iname "passwd"
/etc/passwd
/etc/pam.d/passwd
/etc/test/Passwd

          支持glob风格的通配符:*,?,[],[^]

[root@node1 ~]# find /etc -iname "passwd*"
/etc/passwd
/etc/pam.d/passwd
/etc/passwd-
/etc/test/Passwd
/etc/test/passWD.txt

          -regex pattern:基于正则表达式模式查找文件,匹配是整个路径,而非基名(一般很少用)

        (2)、根据文件从属关系查找:

            -user USERNAME:查找属主为指定用户的所有文件

[root@node1 ~]# find /tmp -user moosefs
/tmp/moosefs
/tmp/moosefs/.bash_logout
/tmp/moosefs/.bash_profile
/tmp/moosefs/.bashrc
/tmp/skel
/tmp/skel/.bash_logout
/tmp/skel/.bash_profile
/tmp/skel/.bashrc
[root@node1 ~]# find /tmp -user archlinux

            -group GRPNAME:查找属组为指定用户的所有文件

            -uid UID:查找属主为指定UID的所有文件;

            -gid GID:查找属组为指定的GID的所有文件;

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

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

        (3)、根据文件的类型查找

            -type TYPE:

                f:普通文件

                d:目录文件

                l:符号链接文件

                b:块设备文件

                c:字符设备文件

                p:管道文件

                s:套接字文件

            查找/dev目录下所有的块设备文件并查看

[root@node1 ~]# find /dev -type b -ls
 10599    0 brw-rw----   1 root     disk     253,   1 Dec 19 18:39 /dev/dm-1
 10548    0 brw-rw----   1 root     disk     253,   0 Dec 19 18:39 /dev/dm-0
 10451    0 brw-rw----   1 root     cdrom     11,   0 Dec 19 18:39 /dev/sr0
 10369    0 brw-rw----   1 root     disk       8,   2 Dec 19 18:39 /dev/sda2
 10368    0 brw-rw----   1 root     disk       8,   1 Dec 19 18:39 /dev/sda1
 10367    0 brw-rw----   1 root     disk       8,   0 Dec 19 18:39 /dev/sda

        (4)、组合测试

          与:-a,默认也是与

          或:-o,但凡是

[root@node1 ~]# find /tmp -nouser -o -type f -ls   #只要符合二者之一即可
35697252    4 -rw-r--r--   1 moosefs  moosefs        18 Aug  3  2017 /tmp/moosefs/.bash_logout
35697253    4 -rw-r--r--   1 moosefs  moosefs       193 Aug  3  2017 /tmp/moosefs/.bash_profile
35697254    4 -rw-r--r--   1 moosefs  moosefs       231 Aug  3  2017 /tmp/moosefs/.bashrc
35697261    4 -rw-r--r--   1 moosefs  moosefs        18 Dec 20 16:47 /tmp/skel/.bash_logout
35697262    4 -rw-r--r--   1 moosefs  moosefs       193 Dec 20 16:47 /tmp/skel/.bash_profile
35697263    4 -rw-r--r--   1 moosefs  moosefs       231 Dec 20 16:47 /tmp/skel/.bashrc
17396129    4 -rw-r--r--   1 root     root         2055 Dec 23 15:43 /tmp/test.etc
16784826   20 -rw-r--r--   1 root     root        17500 Dec 25 15:36 /tmp/function.txt
17790829    8 -rw-r--r--   1 root     root         4253 Dec 26 09:59 /tmp/grub2.cfg
18336343   20 -rw-r--r--   1 root     root        17500 Dec 26 10:03 /tmp/functions
[root@node1 ~]# find /tmp -nouser -a -type f -ls
[root@node1 ~]# 

          非:-not,!

[root@node1 ~]# find /tmp -nouser -not -type f -ls
[root@node1 ~]#

    e、练习

      (1)、找出/tmp目录下属主为非root的所有文件

[root@node1 ~]# find /tmp/ -not -user root -ls
35697251    0 drwx------   2 moosefs  moosefs        62 Dec 19 20:43 /tmp/moosefs
35697252    4 -rw-r--r--   1 moosefs  moosefs        18 Aug  3  2017 /tmp/moosefs/.bash_logout
35697253    4 -rw-r--r--   1 moosefs  moosefs       193 Aug  3  2017 /tmp/moosefs/.bash_profile
35697254    4 -rw-r--r--   1 moosefs  moosefs       231 Aug  3  2017 /tmp/moosefs/.bashrc
35697260    0 drwxr-xr-x   2 moosefs  moosefs        62 Dec 20 16:47 /tmp/skel
35697261    4 -rw-r--r--   1 moosefs  moosefs        18 Dec 20 16:47 /tmp/skel/.bash_logout
35697262    4 -rw-r--r--   1 moosefs  moosefs       193 Dec 20 16:47 /tmp/skel/.bash_profile
35697263    4 -rw-r--r--   1 moosefs  moosefs       231 Dec 20 16:47 /tmp/skel/.bashrc

      (2)、找出/tmp目录下文件名中不包含fstab字符串的文件

[root@node1 ~]# find /tmp -not -iname "*fstab*" -ls

      (3)、找出/tmp目录下属主为非root,而且文件名不包含fstab字符串的文件

[root@node1 ~]# find /tmp -not -user root -a -not -iname "*fstab*" -ls
35697251    0 drwx------   2 moosefs  moosefs        62 Dec 19 20:43 /tmp/moosefs
35697252    4 -rw-r--r--   1 moosefs  moosefs        18 Aug  3  2017 /tmp/moosefs/.bash_logout
35697253    4 -rw-r--r--   1 moosefs  moosefs       193 Aug  3  2017 /tmp/moosefs/.bash_profile
35697254    4 -rw-r--r--   1 moosefs  moosefs       231 Aug  3  2017 /tmp/moosefs/.bashrc
35697260    0 drwxr-xr-x   2 moosefs  moosefs        62 Dec 20 16:47 /tmp/skel
35697261    4 -rw-r--r--   1 moosefs  moosefs        18 Dec 20 16:47 /tmp/skel/.bash_logout
35697262    4 -rw-r--r--   1 moosefs  moosefs       193 Dec 20 16:47 /tmp/skel/.bash_profile
35697263    4 -rw-r--r--   1 moosefs  moosefs       231 Dec 20 16:47 /tmp/skel/.bashrc
[root@node1 ~]# find /tmp -not ( -user root -o  -iname "*fstab*" ) -ls
35697251    0 drwx------   2 moosefs  moosefs        62 Dec 19 20:43 /tmp/moosefs
35697252    4 -rw-r--r--   1 moosefs  moosefs        18 Aug  3  2017 /tmp/moosefs/.bash_logout
35697253    4 -rw-r--r--   1 moosefs  moosefs       193 Aug  3  2017 /tmp/moosefs/.bash_profile
35697254    4 -rw-r--r--   1 moosefs  moosefs       231 Aug  3  2017 /tmp/moosefs/.bashrc
35697260    0 drwxr-xr-x   2 moosefs  moosefs        62 Dec 20 16:47 /tmp/skel
35697261    4 -rw-r--r--   1 moosefs  moosefs        18 Dec 20 16:47 /tmp/skel/.bash_logout
35697262    4 -rw-r--r--   1 moosefs  moosefs       193 Dec 20 16:47 /tmp/skel/.bash_profile
35697263    4 -rw-r--r--   1 moosefs  moosefs       231 Dec 20 16:47 /tmp/skel/.bashrc

    f、根据文件的大小查找

      -size [+|-]#UNIT

        常用单位:k,M,G

        #UNIT:(#-1,#]相当于值可以小于#一点,也可以等于#,但是要大于#-1

        -#UNIT:[0,#-1]相当于值在0到#-1之间,也可以为#-1

[root@node1 ~]# find /tmp/ -size 45k #等于45k的,这个在44k-45k之间,但是不包括44k,可以包括45k
/tmp/messages
/tmp/messages.2
[root@node1 ~]# find /tmp/ -size -45k  #小于45k的,但是不包括44k-45k之间,如果等于44k也可以匹配到
/tmp/
/tmp/.Test-unix
/tmp/.font-unix
/tmp/.ICE-unix
/tmp/.X11-unix
/tmp/.XIM-unix

        +#UNIT:(#,oo) 。相当于值需要大于#的

[root@node1 ~]# find /tmp/ -size +45k
[root@node1 ~]# find /tmp/ -size +44k
/tmp/messages
/tmp/messages.2
[root@node1 ~]# find /tmp/ -size -44k
/tmp/
/tmp/.Test-unix
/tmp/.font-unix
/tmp/.ICE-unix
/tmp/.X11-unix
/tmp/.XIM-unix
[root@node1 ~]# find /tmp/ -size 44k
[root@node1 ~]# find /tmp/ -size -45k
/tmp/
/tmp/.Test-unix
/tmp/.font-unix
/tmp/.ICE-unix
/tmp/.X11-unix
/tmp/.XIM-unix
[root@node1 ~]# find /tmp/ -size 45k
/tmp/messages
/tmp/messages.2

    g、根据时间戳查找

      以天为单位

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

          #:[#,#-1)  ,假如是刚好3天访问,那么就是大于等于三天并且小于四天。如果是三天外访问,那么就是等于四天或四天以上

          -#:(#,0:]:假如是三天内就表示小于三天或等于0天

          +#:(oo,#-1]:假如是三天外就表示大于等于4天

        -mtime  :(修改时间)

        -ctime   (改变时间)

          查找/etc目录下至少7天没有访问过的文件

[root@node1 ~]# find /etc/ -atime +7

          查找/etc目录下一天没有访问过的文件

[root@node1 ~]# find /etc/ -atime -1

        以分钟为单位

        -amin

        -mmin

        -cmin

    h、根据权限查找

      -perm [/|-] mode

        mode:精确权限匹配

          查找/etc目录下权限为644的文件

[root@node1 test]# find /etc/test/  -perm 644 -ls
2617990    0 -rw-r--r--   1 root     root            0 Dec 26 15:02 /etc/test/Passwd
2617991    0 -rw-r--r--   1 root     root            0 Dec 26 15:08 /etc/test/passWD.txt

        /mode:任何一类用户(u,g,o)的权限中的任何一位(r,w,x)符合条件即满足。即9位权限之间存在"或关系"

          查找至少有一类用户有写权限的文件

[root@localhost ~]# find /tmp -perm /222 -ls
33554504    0 drwxrwxrwt   7 root     root          182 Dec 28 05:42 /tmp
33881475    0 drwxrwxrwt   2 root     root            6 Oct 24  2018 /tmp/.X11-unix
67477957    0 drwxrwxrwt   2 root     root            6 Oct 24  2018 /tmp/.XIM-unix
100884653    0 drwxrwxrwt   2 root     root            6 Oct 24  2018 /tmp/.Test-unix
33881477    0 drwxrwxrwt   2 root     root            6 Oct 24  2018 /tmp/.font-unix
67477958    0 drwxrwxrwt   2 root     root            6 Oct 24  2018 /tmp/.ICE-unix
33554505    4 -rw-r--r--   1 root     root           23 Dec 17 05:26 /tmp/issue.tee
33557895    4 -rw-r-----   1 archlinux mygrp         511 Dec 21 18:01 /tmp/inittab
33557896    0 -rw-------   1 root     root            0 Dec 21 18:07 /tmp/mytmp.bK3U
33557902    0 -rw-------   1 root     root            0 Dec 21 18:08 /tmp/mytmp.XkTnt
33557903    0 -rw-------   1 root     root            0 Dec 21 18:08 /tmp/mytmp.HwcI                

        -mode:每一类用户(u,g,o)的权限中的每一位(r,w,x)同时符合条件即满足。9位权限之间是与关系。    

          查找三类用户都有写权限的文件

[root@localhost ~]# find /tmp -perm -222 -ls
33554504    0 drwxrwxrwt   7 root     root          182 Dec 28 05:42 /tmp
33881475    0 drwxrwxrwt   2 root     root            6 Oct 24  2018 /tmp/.X11-unix
67477957    0 drwxrwxrwt   2 root     root            6 Oct 24  2018 /tmp/.XIM-unix
100884653    0 drwxrwxrwt   2 root     root            6 Oct 24  2018 /tmp/.Test-unix
33881477    0 drwxrwxrwt   2 root     root            6 Oct 24  2018 /tmp/.font-unix
67477958    0 drwxrwxrwt   2 root     root            6 Oct 24  2018 /tmp/.ICE-unix

    i、处理动作

      -print:输出至标准输出;默认的动作

      -ls:类似于对查找到的文件执行ls -l命令,输出文件的详细信息

      -delete:删除查找到的文件

      -fls  /PATH/TO/SOMEFILE:把查找到的所有文件的长格式信息保存至指定文件中

      -ok  COMMAND {} ;   这是固定格式,表示对查找到的每个文件执行由COMMAND表示的命令;每次操作都由用户确认

        我们查找没有属主的文件并将其属主改为root

[root@localhost /]# find /etc/test -nouser -a -nogroup -ls
67147409    0 -rw-r--r--   1 1001     1001            0 Dec 28 05:57 /etc/test/a
67147410    0 -rw-r--r--   1 1001     1001            0 Dec 28 05:57 /etc/test/b
67147411    0 -rw-r--r--   1 1001     1001            0 Dec 28 05:57 /etc/test/c
[root@localhost /]# find /etc/test -nouser -a -nogroup -ok chown root:root {} ;
< chown ... /etc/test/a > ? y
< chown ... /etc/test/b > ? y
< chown ... /etc/test/c > ? y

      -exec COMMAND {} ;  这是固定格式,表示对查到的每个文件执行由COMMAND表示的命令,每次操作不需要用户确认。

        我们找/etc/test目录下其它用户有写权限的文件并给其改名为文件名.danger

[root@localhost /]# find /etc/test/ -perm /002 -exec mv {} {}.danger ;

      注意:find传递查找到的文件路径至后面的命令时,是先查找出所有符合条件的路径,并一次性传递给后面的命令。但是有些命令不能接受过长的参数,此时命令执行会失败。另一种方式可规避此问题:

        find |xargs COMMAND

  4、课外作业:学习xargs命令的用法

二、练习

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

[root@localhost /]# find /var -user root -a -group mail -ls
 38568    0 drwxrwxr-x   2 root     mail           48 Dec 28 05:58 /var/spool/mail

  2、查找/usr目录下不属于root,bin或hadoop的所有文件或目录;用两种方法、、

[root@localhost /]# useradd hadoop
[root@localhost /]# find /usr -not -user root -a -not -user bin -a -not -user hadoop -ls
33881482    0 drwx------   2 polkitd  root            6 Apr 11  2018 /usr/share/polkit-1/rules.d
750324   16 -rwsr-sr-x   1 abrt     abrt        15432 Apr 27  2018 /usr/libexec/abrt-action-install-debuginfo-to-abrt-cache
[root@localhost /]# find /usr -not ( -user root -o -user bin -o -user hadoop ) -ls
33881482    0 drwx------   2 polkitd  root            6 Apr 11  2018 /usr/share/polkit-1/rules.d
750324   16 -rwsr-sr-x   1 abrt     abrt        15432 Apr 27  2018 /usr/libexec/abrt-action-install-debuginfo-to-abrt-cache

  3、查找/etc目录下最近一周内其内容修改过,且属主不是root用户也不是hadoop用户的文件或目录

[root@localhost /]# find /etc -mtime -7 -a -not -user root -a -not -user hadoop -ls
67147398    4 -rw-r--r--   1 fedora   fedora       1330 Dec 28 06:25 /etc/test/passwd
67147413    4 -rw-r--r--   1 archlinux mygrp        1330 Dec 28 06:26 /etc/test/passwdx
[root@localhost /]# find /etc -mtime -7 -a -not ( -user root -o -user hadoop ) -ls
67147398    4 -rw-r--r--   1 fedora   fedora       1330 Dec 28 06:25 /etc/test/passwd
67147413    4 -rw-r--r--   1 archlinux mygrp        1330 Dec 28 06:26 /etc/test/passwdx

  4、查找当前系统上没有属主或属组,且最近一周内曾被访问过的文件或目录。(如果加了或条件后面要跟 -ls的话需要加括号,否则只有-o后面一部分会被ls)

[root@localhost /]# find /  ( -nouser -o -nogroup )  -atime -7 -ls
67147398    4 -rw-r--r--   1 1004     1005         1330 Dec 28 06:25 /etc/test/passwd

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

[root@localhost /]# find /etc -size +1M -ls
101020613 3664 -rw-------   1 root     root      3750215 Apr 12  2018 /etc/selinux/targeted/active/policy.kern
67545879 1328 -rw-r--r--   1 root     root      1357405 Apr 12  2018 /etc/selinux/targeted/contexts/files/file_contexts.bin
33988106 3664 -rw-r--r--   1 root     root      3750215 Apr 12  2018 /etc/selinux/targeted/policy/policy.31
67146832 7600 -r--r--r--   1 root     root      7780559 Oct 24  2018 /etc/udev/hwdb.bin
[root@localhost /]# find /etc -size +1M  -type f -exec ls -lh {} ;
-rw-------. 1 root root 3.6M Apr 12  2018 /etc/selinux/targeted/active/policy.kern
-rw-r--r--. 1 root root 1.3M Apr 12  2018 /etc/selinux/targeted/contexts/files/file_contexts.bin
-rw-r--r--. 1 root root 3.6M Apr 12  2018 /etc/selinux/targeted/policy/policy.31
-r--r--r--. 1 root root 7.5M Oct 24  2018 /etc/udev/hwdb.bin

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

[root@localhost /]# find /etc -not -perm /222 -type f -exec ls -lh {} ;

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

[root@localhost /]# find /etc -not -perm -111 -type f -ls

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

[root@localhost /]# find /etc -perm -111 -a -perm -002 -type f -ls
[root@localhost /]# find /etc -perm -113 -ls -type f -ls

      

  

原文地址:https://www.cnblogs.com/Presley-lpc/p/12102403.html