zoukankan      html  css  js  c++  java
  • find命令基础讲解

    目录

       前言

    find命令

    查找条件

       指定搜索层级

       根据文件名和inode查找

       根据属名属主查找

       根据文件类型查找

       组合条件

       根据文件大小查找

       根据时间戳查找

       根据权限查找

       动作处理

       参数替换xargs

    扩展

       基于数据库的查找locate

    前言

    我们的操作系统都是由千千万万个文件组成的,当我们访问某个文件时,如果是在windows操作系统下,由于此操作系统对文件明名后缀的定义的功能十分严格,所以我们很容易就能在Windows下找到我们所需要的文件。即便是文件过于错综复杂,我们依旧可以在图形化的Windows下通过固定的文件后缀查找我们所需要的文件。

    但是在linux下情况不是那么乐观,因为在linux下对文件名后缀是没有要求的,文件可以是任何后缀名,这对执行或浏览并没有任何问题。这也就造成了文件查找的不便,但是有一点好处是,在linux下有很多查找工具,我们可以借助工具锁定文件的某一特性进行查找,这里面的我们要说一说“find”命令。

    find是一种实时查找工具,它可以通过便利指定路径完成文件的查找,它的特点是:查找速度略慢,精确查找,实时查找,只能搜索用户具备读取和执行权限的目录

     

    find命令

       格式:find [option] [查找路径] [查找条件] [处理动作]

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

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

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

    查找条件

    指定搜索层级

       我们在查找文件时,知道文件并不是放在某个很层级很多的目录中,此时我们可以限定搜索的层级,在一定的层级范围内所搜我们想要查找的文件。

       -maxdepth level 最大搜索目录深度,指定目录为第1

    -mindepth level 最小搜索目录深度

    [root@CT71 etc]#find -maxdepth 3 | less
    ……
    ./fonts/conf.d/65-0-lohit-marathi.conf
    ./fonts/conf.d/59-liberation-mono.conf
    ./fonts/conf.d/66-ucs-miscfixed.conf
    ./fonts/conf.d/59-liberation-sans.conf
    ./fonts/conf.d/60-open-sans.conf
    ./fonts/conf.d/10-scale-bitmap-fonts.conf
    ./fonts/conf.d/65-0-madan.conf
    ./fonts/conf.d/20-unhint-small-vera.conf
    ……
    [root@CT71 etc]#find -mindepth 4 | less
    ./pki/ca-trust/extracted/README
    ./pki/ca-trust/extracted/java
    ./pki/ca-trust/extracted/java/README
    ./pki/ca-trust/extracted/java/cacerts
    ./pki/ca-trust/extracted/openssl

    根据文件名和inode查找

    同时,我们如果知道文件名或inode号,还可以通过文件名或inode号查找查找。

    -name "文件名称":支持使用glob(通配符):*, ?, [], [^]

    -iname "文件名称":不区分字母大小写

    -inum n inode号查找

    -samefile name 相同inode号的文件

    -links n 链接数为n的文件

    -regex 支持正则 默认为(emacs标准)

       -regextype egrep -regex 支持egrep同标准的正则

    [root@CT71 etc]#find -name "fstab"
    ./fstab
    [root@CT71 etc]#ll
    -i fstab 67160130 -rw-r--r--. 1 root root 595 Jul 11 18:42 fstab [root@CT71 etc]#find -inum 67160130 ./fstab
    [root@CT71 app]#
    find -samefile tty1 ./tty1 ./tty2
    [root@CT71 app]#ll
    -i total 8 67 -rw-r--r--. 2 root root 6 Aug 8 09:01 tty1 67 -rw-r--r--. 2 root root 6 Aug 8 09:01 tty2
    [root@CT71 app]#
    find -links 2 . ./tty1 ./tty2
    [root@CT71 app]#
    find -regextype egrep -regex ".*.txt$" ./lianxi_123.txt

    根据属主、属组查找

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

    -group GRPNAME: 查找属组为指定组(GID)的文件

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

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

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

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

     

    [root@CT71 app]#find / -user Tom
    /home/Tom
    /home/Tom/.mozilla
    /home/Tom/.mozilla/extensions
    /home/Tom/.mozilla/plugins
    /home/Tom/.bash_logout
    /home/Tom/.bash_profile
    /home/Tom/.bashrc
    [root@CT71 app]#
    find /home/ -group Tom /home/Tom /home/Tom/.mozilla /home/Tom/.mozilla/extensions /home/Tom/.mozilla/plugins /home/Tom/.bash_logout
    [root@CT71 app]#
    find /home/ -uid 1002 /home/Tony /home/Tony/.mozilla /home/Tony/.mozilla/extensions /home/Tony/.mozilla/plugins /home/Tony/.bash_logout /home/Tony/.bash_profile 

    根据文件类型查找

    -type TYPE:

    f : 普通文件

    d: 目录文件

    l: 符号链接文件

    s:套接字文件

    b: 块设备文件

    c: 字符设备文件

    p: 管道文件

    [root@CT71 app]#find / -type l | less
    /dev/disk/by-label/CentOSx207x20x86_64
    /dev/disk/by-uuid/2016-12-05-13-52-39-00
    /dev/disk/by-uuid/8c59579c-30fb-417a-9fd2-cc0dd58d261e
    /dev/disk/by-uuid/0292b8be-15bb-4b5a-87e3-01519be7c6de
    ......
    [root@CT71 app]#
    find / -type b | less /dev/sda5 /dev/sda4 /dev/sda3 /dev/sda2 /dev/sda1 /dev/sda /dev/sr0

    组合条件

       与:-a

    或:-o

    非:-not!

     

    摩根定律:

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

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

    示例:

    find -user joe -not -group joe

    find -user joe -o -user jane  

    find -not ( -user joe -o -user jane )

    find / -user joe -o -uid 500

     

    find ./ -path './dir0*' -a -prune -o -name *.txt -print

    命令行的意思是:如果目录dir0存在(即-a左边为真),则求-prune的值,-prune 返回真,‘与’逻辑表达式为真(即-path './dir0*' -a -prune 为真),find命令将在除这个目录以外的目录下查找txt后缀文件并打印出来;如果目录dir0不存在(即-a左边为假),则不求值-prune ,‘与’逻辑表达式为假,则在当前目录下查找所有txt后缀文件。

     

    在我的机器上,我想查找在根下既所有者即不是root也不是Tom的文件

    [root@CT71 ~]#find / ! ( -user root -o -user Tom ) -ls
     23114    0 drwxr-xr-x   2 qemu     qemu            0 Aug  9 20:25 /dev/hugepages/libvirt/qemu
     15970    0 dr-xr-xr-x   9 dbus     dbus            0 Aug  9 20:24 /proc/551
     16438    0 dr-xr-xr-x   4 dbus     dbus            0 Aug  9 20:24 /proc/551/task
     16439    0 dr-xr-xr-x   6 dbus     dbus            0 Aug  9 20:24 /proc/551/task/551
     16440    0 dr-xr-xr-x   2 dbus     dbus            0 Aug  9 20:24 /proc/551/task/551/attr
     49617    0 dr-xr-xr-x   6 dbus     dbus            0 Aug 10 08:40 /proc/551/task/560
     49745    0 dr-xr-xr-x   2 dbus     dbus            0 Aug 10 08:40 /proc/551/task/560/attr
     49583    0 dr-xr-xr-x   6 dbus     dbus            0 Aug 10 08:40 /proc/551/net
     49603    0 dr-xr-xr-x   2 dbus     dbus            0 Aug 10 08:40 /proc/551/attr
     16132    0 dr-xr-xr-x   9 polkitd  polkitd         0 Aug  9 20:24 /proc/565
     51727    0 dr-xr-xr-x   8 polkitd  polkitd         0 Aug 10 08:40 /proc/565/task
     51765    0 dr-xr-xr-x   6 polkitd  polkitd         0 Aug 10 08:40 /proc/565/task/565
     51797    0 dr-xr-xr-x   2 polkitd  polkitd         0 Aug 10 08:40 /proc/565/task/565/attr
     51766    0 dr-xr-xr-x   6 polkitd  polkitd         0 Aug 10 08:40 /proc/565/task/622
     51874    0 dr-xr-xr-x   2 polkitd  polkitd         0 Aug 10 08:40 /proc/565/task/622/attr

    在上面的试验中,我们有需要注意的地方,那就是括号,我们需要给它进行转译,否则,find命令无法识别。还有就是括号内两侧要留空格,不然不能使用。后面的-ls是我们在下面会说到的动作处理。在这里我们先使用一下,-ls的作用是列出文件的信息。

    根据文件大小来查找

       -size [+|-]#UNIT

       常用单位:k, M, Gcbyte

          #UNIT: (#-1, #]如:6k 表示(5k,6k]

          -#UNIT[0,#-1]如:-6k 表示[0,5k]

          +#UNIT(#,)如:+6k 表示(6k,) 

    [root@CT71 bin]#find /var -size +10M
    /var/lib/rpm/Packages
    /var/cache/yum/x86_64/7/base/gen/primary_db.sqlite
    /var/cache/yum/x86_64/7/base/gen/filelists_db.sqlite
    /var/cache/yum/x86_64/7/updates/gen/primary_db.sqlite
    /var/cache/yum/x86_64/7/updates/gen/filelists_db.sqlite
    [root@CT71 app]#ll -h
    total 33M
    -rw-r--r--. 1 root root 4.5M Aug 10 08:57 vm
    -rw-r--r--. 1 root root  27M Aug 10 08:58 vmA
    [root@CT71 app]#find -size 5M  ----------------------------------------------- 找大于4M小于5M的文件
    ./vm
    [root@CT71 app]#find -size 27M  ----------------------------------------------- 找大于26M小于27M的文件
    ./vmA
    [root@CT71 app]#ll  vmA
    -rw-r--r--. 1 root root 28307124 Aug 10 08:58 vmA  ----------------------------------- 27M = 28311522k
    [root@CT71 app]#

    根据时间戳查找

    根据时间戳:

    以“天”为单位;

    -atime [+|-]#,

    #: [#,#+1)

    +#: [#+1,]

    -#: [0,#)

    -mtime

    -ctime

    以“分钟”为单位:

    -amin

    -mmin

    -cmin

    我们要查找某一天的文件,就是指从某一天的凌晨到这一天结束前的文件,我们也可以在时间后面加上其他条件,以增加查找的精度。

    [root@CT71 app]#touch date{1..7}.txt
    [root@CT71 app]#ll
    total 0
    -rw-r--r--. 1 root root 0 Aug 10 09:10 date1.txt
    -rw-r--r--. 1 root root 0 Aug 10 09:10 date2.txt
    -rw-r--r--. 1 root root 0 Aug 10 09:10 date3.txt
    -rw-r--r--. 1 root root 0 Aug 10 09:10 date4.txt
    -rw-r--r--. 1 root root 0 Aug 10 09:10 date5.txt
    -rw-r--r--. 1 root root 0 Aug 10 09:10 date6.txt
    -rw-r--r--. 1 root root 0 Aug 10 09:10 date7.txt
    [root@CT71 app]#touch -t 201708071231 date3.txt 
    [root@CT71 app]#stat date3.txt 
      File: ‘date3.txt’
      Size: 0             Blocks: 0          IO Block: 4096   regular empty file
    Device: 803h/2051d    Inode: 69          Links: 1
    Access: (0644/-rw-r--r--)  Uid: (    0/    root)   Gid: (    0/    root)
    Context: unconfined_u:object_r:default_t:s0
    Access: 2017-08-07 12:31:00.000000000 +0800
    Modify: 2017-08-07 12:31:00.000000000 +0800
    Change: 2017-08-10 09:11:31.127117025 +0800
     Birth: -
    [root@CT71 app]#touch -t 201708071131 date4.txt 
    [root@CT71 app]#stat date4.txt 
      File: ‘date4.txt’
      Size: 0             Blocks: 0          IO Block: 4096   regular empty file
    Device: 803h/2051d    Inode: 70          Links: 1
    Access: (0644/-rw-r--r--)  Uid: (    0/    root)   Gid: (    0/    root)
    Context: unconfined_u:object_r:default_t:s0
    Access: 2017-08-07 11:31:00.000000000 +0800
    Modify: 2017-08-07 11:31:00.000000000 +0800
    Change: 2017-08-10 09:12:50.962118411 +0800
     Birth: -
    -----------------------------------------------------------------------------------------

    [root@CT71 app]#find . -atime 2
    ./date3.txt
    ./date4.txt

    我们查找到了两天以前访问过的文件,但是不包括第二天,也就是从三天前的凌晨到第二天之前的文件。上面是使用的atime做的实验,换成mtime或者amin效果是一样的,这里就不在做过多的演示。

    根据权限查找

    -perm [/|-]MODE

    MODE: 精确权限匹配

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

    + centos7开始淘汰

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

    0 表示不关注

       示例:

          find -perm 755 会匹配权限模式恰好是755的文件

    只要当任意人有写权限时, find -perm +222就会匹配

    只有当每个人都有写权限时, find -perm -222才会匹配

    只有当其它人(other)有写权限时, find -perm -002才会匹配

     

    首先是精确匹配权限:

    [root@CT71 etc]#find . -perm 400 -ls
    496877    4 -r--------   1 root     root           45 Jul 11 18:44 ./openldap/certs/password
    [root@CT71 etc]#find . -perm 000 -ls
    69022747    4 ----------   1 root     root         1044 Aug  7 18:48 ./gshadow
    69022742    4 ----------   1 root     root         2053 Aug  7 18:48 ./shadow
    67160186    4 ----------   1 root     root         1054 Aug  7 18:47 ./gshadow-
    67557582    4 ----------   1 root     root         2177 Aug  7 18:47 ./shadow-

    然后是,只要ugo任何一位任何一种权限可以匹配得上就可以:我们可以看到匹配到的文件在u位上都有r权限

    [root@CT71 etc]#find . -perm /400 -ls | less
    
    67160129   12 drwxr-xr-x 133 root     root         8192 Aug 10 07:51 .
    67160130    4 -rw-r--r--   1 root     root          595 Jul 11 18:42 ./fstab
    67160131    0 -rw-------   1 root     root            0 Jul 11 18:42 ./crypttab
    67160132    0 lrwxrwxrwx   1 root     root           17 Aug  9 20:19 ./mtab -> /proc/self/mounts
    67160171    4 -rw-r--r--   1 root     root           70 Aug 10 07:51 ./resolv.conf
    33554510    0 drwxr-xr-x   3 root     root           38 Jul 11 18:44 ./fonts
    67160164    8 drwxr-xr-x   2 root     root         4096 Jul 11 18:49 ./fonts/conf.d
    68946978    0 lrwxrwxrwx   1 root     root           56 Jul 11 18:49 ./fonts/conf.d/65-0-lohit-marathi.conf -> /usr/share/fontconfig/conf.avail/65-0-lohit-marathi.conf
    67337313    0 lrwxrwxrwx   1 root     root           56 Jul 11 18:44 ./fonts/conf.d/59-liberation-mono.conf -> /usr/share/fontconfig/conf.avail/59-liberation-mono.conf
    68946986    0 lrwxrwxrwx   1 root     root           54 Jul 11 18:49 ./fonts/conf.d/66-ucs-miscfixed.conf -> /usr/share/fontconfig/conf.avail/66-ucs-miscfixed.conf
    67337328    0 lrwxrwxrwx   1 root     root           56 Jul 11 18:44 ./fonts/conf.d/59-liberation-sans.conf -> /usr/share/fontconfig/conf.avail/59-liberation-sans.conf
    68946987    0 lrwxrwxrwx   1 root     root    

    接下来必须匹配的权限,也就是说:我要的权限你必须的匹配得到,其他我没有匹配到的,可以有,也可以没有.

    [root@CT71 etc]#find . -perm -466 -ls  | less
    
    67160132    0 lrwxrwxrwx   1 root     root           17 Aug  9 20:19 ./mtab -> /proc/self/mounts
    68946978    0 lrwxrwxrwx   1 root     root           56 Jul 11 18:49 ./fonts/conf.d/65-0-lohit-marathi.conf -> /usr/share/fontconfig/conf.avail/65-0-lohit-marathi.conf
    67337313    0 lrwxrwxrwx   1 root     root           56 Jul 11 18:44 ./fonts/conf.d/59-liberation-mono.conf -> /usr/share/fontconfig/conf.avail/59-liberation-mono.conf
    68946986    0 lrwxrwxrwx   1 root     root           54 Jul 11 18:49 ./fonts/conf.d/66-ucs-miscfixed.conf -> /usr/share/fontconfig/conf.avail/66-ucs-miscfixed.conf
    67337328    0 lrwxrwxrwx   1 root     root           56 Jul 11 18:44 ./fonts/conf.d/59-liberation-sans.conf -> /usr/share/fontconfig/conf.avail/59-liberation-sans.conf
    68946987    0 lrwxrwxrwx   1 root     root           50 Jul 11 18:49 ./fonts/conf.d/60-open-sans.conf -> /usr/share/fontconfig/conf.avail/60-open-sans.conf
    67337364    0 lrwxrwxrwx   1 root     root           59 Jul 11 18:44 ./fonts/conf.d/10-scale-bitmap-fonts.conf -> /usr/share/fontconfig/conf.avail/10-scale-bitmap-fonts.conf
    68946990    0 lrwxrwxrwx   1 root     root           48 Jul 11 18:49 ./fonts/conf.d/65-0-madan.conf -> /usr/share/fontconfig/conf.avail/65-0-madan.conf
    67337372    0 lrwxrwxrwx   1 root     root           58 Jul 11 18:44 ./fonts/conf.d/20-unhint-small-vera.conf -> /usr/share/fontconfig/conf.avail/20-unhint-small-vera.conf

    动作处理

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

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

    -delete:删除查找到的文件

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

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

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

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

    find传递查找到的文件至后面指定的命令时,查找到所有符合条件的文件一次性传递给后面的命令

    动作处理很简单啦,就是处理我们find查找到的文件进行后续的处理,接下来我们对动作处理做简单演示

    [root@CT71 etc]#find . -atime 1 -ls 
    67323613   12 -rw-r--r--   1 root     root        10923 Nov  5  2016 ./pki/tls/openssl.cnf
    720795    4 -rw-r--r--   1 root     root         2208 Nov 12  2016 ./ssh/ssh_config
    69022755    4 -rw-r--r--   1 root     root         2914 Aug  8 21:07 ./bashrc
    69022753    4 -rw-r--r--   1 root     root         1829 Aug  8 20:58 ./profile
    69080768    4 -rw-r--r--   1 root     root         2015 Aug  1 16:02 ./vimrc
    67160616  656 -rw-r--r--   1 root     root       670293 Jun  7  2013 ./services

      [root@CT71 etc]#find . -atime 1 -fls /app/dadas$(date +"%F")
      [root@CT71 etc]#cd /app/
      [root@CT71 app]#ll
      total 4
      -rw-r--r--. 1 root root 2193 Aug 10 09:42 dadas2017-08-10 

     [root@CT71 app]#find . -name "dat*"
     ./date1.txt
     ./date2.txt
     ./date3.txt
     ./date4.txt
     ./date5.txt
     ./date6.txt
     ./date7.txt
     [root@CT71 app]#find . -name "dat*" -ok rm {} ;
     < rm ... ./date1.txt > ? y
     < rm ... ./date2.txt > ? y
     < rm ... ./date3.txt > ? y
     < rm ... ./date4.txt > ? y
     < rm ... ./date5.txt > ? y
     < rm ... ./date6.txt > ? y
     < rm ... ./date7.txt > ? y

    参数替换

    由于很多命令不支持管道|来传递参数,而日常工作中有这个必要,所以就有了xargs命令。xargs用于产生某个命令的参数, xargs 可以读入 stdin 的数据,并且以空格符或回车符将 stdin 的数据分隔成为arguments。有些命令不能接受过多参数,命令执行可能会失败, xargs可以解决

    findxargs格式: find | xargs COMMAND

    示例:

    ls f* |xargs rm

    find /sbin -perm +7000 | xargs ls –l

    [root@CT71 app]#find -name "data*" | xargs ls -li
    67 -rw-r--r--. 1 root root 0 Aug 10 09:48 ./datas_a1.txt
    68 -rw-r--r--. 1 root root 0 Aug 10 09:48 ./datas_a2.txt
    69 -rw-r--r--. 1 root root 0 Aug 10 09:48 ./datas_a3.txt
    70 -rw-r--r--. 1 root root 0 Aug 10 09:48 ./datas_a4.txt
    71 -rw-r--r--. 1 root root 0 Aug 10 09:48 ./datas_b1.txt
    72 -rw-r--r--. 1 root root 0 Aug 10 09:48 ./datas_b2.txt
    73 -rw-r--r--. 1 root root 0 Aug 10 09:48 ./datas_b3.txt
    75 -rw-r--r--. 1 root root 0 Aug 10 09:48 ./datas_b4.txt
    76 -rw-r--r--. 1 root root 0 Aug 10 09:48 ./datas_c1.txt
    77 -rw-r--r--. 1 root root 0 Aug 10 09:48 ./datas_c2.txt
    78 -rw-r--r--. 1 root root 0 Aug 10 09:48 ./datas_c3.txt
    79 -rw-r--r--. 1 root root 0 Aug 10 09:48 ./datas_c4.txt

    扩展

    基于数据库的查找

    locate这个命令是基于数据库查找我们所需要的文件的,它没有很多的参数,不能像find那样进行基于某一方面的精确查找。使用locate查找文件,其实就是查找系统上预建的文件索引数据库/var/lib/mlocate/mlocate.db由于它依赖于事先构建的索引,而索引的构建是在系统较为空闲时自动进行的,所以,我们在当时新建的文件或目录以及更新无法在当时使用locate查询,如果想要查询,需要手动更新数据库(updatedb)。

       并且,索引构建过程需要遍历整个根文件系统,及消耗资源,它有以下工作特点:

    查找速度快,模糊查找,非实时查询,搜索的是文件的全路径不仅仅是文件名,可能只搜索用户具备读取和执行权限的目录

    命令:locate

    选项:

       -i:不区分大小写搜索

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

       -r:使用正则搜索

     

    [root@CT71 app]#locate /etc/ -i "*shad*" | less
    /etc/.pwd.lock
    /etc/.updated
    /etc/DIR_COLORS
    /etc/DIR_COLORS.256color
    /etc/DIR_COLORS.lightbgcolor
    /etc/GREP_COLORS
    /etc/GeoIP.conf
    ... ...
    [root@CT71 app]#locate -r ".*a.conf$" | less
    /etc/pbm2ppa.conf
    /etc/pnm2ppa.conf
    /etc/abrt/abrt-action-save-package-data.conf
    /etc/fonts/conf.d/20-unhint-small-vera.conf
    /etc/fonts/conf.d/25-no-bitmap-fedora.conf
    /etc/fonts/conf.d/65-0-lohit-kannada.conf
    /etc/fonts/conf.d/65-0-lohit-oriya.conf
    /etc/fonts/conf.d/65-0-smc-meera.conf
    /etc/fonts/conf.d/66-sil-abyssinica.conf
    /etc/java/java.conf
    ... ...

     

  • 相关阅读:
    嵌入式开发之zynq——zynq开发环境搭建
    嵌入式开发之zynq——赛灵思的一款两a9加一fpga芯片的开发板
    数据结构和算法的选择
    找工作看准网
    健康情感之招聘---图像算法工程师
    grafana 邮件报警
    ELK logstash邮件报警
    grafana + influxdb + telegraf
    centos 6.5 上安装使用upsource
    ELK 中的elasticsearch 集群的部署
  • 原文地址:https://www.cnblogs.com/duzhaoqi/p/7337615.html
Copyright © 2011-2022 走看看