zoukankan      html  css  js  c++  java
  • 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

          

      

  • 相关阅读:
    JavaScript三元运算符
    JavaScript相等运算符
    SQL 查询优化
    C# 平时碰见的问题【2】
    android 利用TrafficStats类获取本应用的流量
    android 输出.txt 文本换行问题
    【转载】input 中 type='text' 的提交问题
    Pycharm 使用 (一)
    SqlBulkCopy 插入100W条数据时 属性BatchSize的作用
    C# 平时碰见的问题【1】
  • 原文地址:https://www.cnblogs.com/Presley-lpc/p/12102403.html
Copyright © 2011-2022 走看看