• find命令详解


    学会使用find之前,先补充下通配符小知识,对于使用find命令会有很多帮助

    *  任意多个任意字符

    ?  单个字符

    [a-z]  多个字符或连续范围中的一个,若无则忽略

    {a,min,xyz}  多组不同的字符串,全匹配 

     

    find

    find命令是用于实现精确查找,实时查找指定目录下面的文件。在工作中常用。优点是:实时,精确。缺点是:比较占用系统资源,比较慢一点。
    在总结find之前,先简单总结一下which,whereis,locate简单用法。他们都是用于查找和定位文件的命令。

    1.which命令 查找命令的二进制文件位置

    例如:
    ]# which id
    /usr/bin/id
    ]# which cd
    /usr/bin/cd

    2.whereis 文件名字的查找

    选项 -b,只查找二进制文件
    -m 只查找使用手册路径下的文件

    例如:
    ]# whereis ifconfig
    ifconfig: /usr/sbin/ifconfig /usr/share/man/man8/ifconfig.8.gz
    ]# whereis passwd
    passwd: /usr/bin/passwd /etc/passwd /usr/share/man/man1/passwd.1.gz
    查找文件名为passwd 的文件 默认情况下使用手册所在的章节都会查找出来。

    3.locate 快速定位给定的文件名,也可以给定文件的部分名字。

    常用选项:
    -i   忽略大小写
    -l   输出前几行,例如 -l 5 输出找到的结果前5行
    -S 输出locate使用的数据库信息
    -b  只匹配路径中基名
    -c  只统计查到的符合条件文件数量
    -r  使用正则表达式
    locate的优点是速度非常快,但是不能实现精确查找,同时依赖于已建立的数据库/var/lib/mlocatel里面的数据进行查找,不用搜索硬盘,所有很快。但是当你新建文件时,数据库还没有更新,默认是每天自动执行执行一次更新,这时候locat是无法查到的,这时候需要手动执行updatedb更新即可。

    例如:
    ]# locate -l 5 passwd
    /etc/passwd
    /etc/passwd-
    /etc/pam.d/passwd
    /etc/security/opasswd
    /home/dxl/passwd
    ]# locate -S
    数据库 /var/lib/mlocate/mlocate.db:
    14,196 文件夹
    82,472 文件
    4,403,787 文件名中的字节数
    2,007,138 字节用于存储数据库


     

    find命令详解

    功能:对文进行实时,精确查找。
    用法:find [OPTIONS] [查找起始路径] [查找条件] [处理动作]
    查找起始路径:指定查找范围,默认是当前工作目录下进行查找
    查找条件:指定查找目标的查找标准,可以根据文件名、大小、类型、从属关系、权限等标准进行;默认为找出指定路径下的所有文件。
    处理动作:对查找出来的文件进行删除,移动等操作,默认为输出到屏幕上。

    find命令的参数

    pathname: find命令所查找的目录路径。例如用.来表示当前目录,用/来表示系统根目录。
    -print: find命令将匹配的文件输出到标准输出。
    -exec: find命令对匹配的文件执行该参数所给出的shell命令。相应命令的形式为'command' { } ;,注意{ }和;之间的空格。
    -ok: 和-exec的作用相同,只不过以一种更为安全的模式来执行该参数所给出的shell命令,在执行每一个命令之前,都会给出提示,让用户来确定是否执行。

    #-print 将查找到的文件输出到标准输出
    #-exec   command   {} ;      —–将查到的文件执行command操作,{} 和 ;之间有空格
    #-ok 和-exec相同,只不过在操作前要询用户

    -name   filename              #查找名为filename的文件
    -perm                               #按执行权限来查找
    -user    username            #按文件属主来查找
    -group groupname          #按组来查找
    -mtime   -n +n                 #按文件更改时间来查找文件,-n指n天以内,+n指n天以前
    -atime    -n +n                 #按文件访问时间来查GIN: 0px">

    -ctime    -n +n                 #按文件创建时间来查找文件,-n指n天以内,+n指n天以前

    -nogroup                        #查无有效属组的文件,即文件的属组在/etc/groups中不存在

    -nouser                          #查无有效属主的文件,即文件的属主在/etc/passwd中不存
    -newer   f1 !f2                #找文件,-n指n天以内,+n指n天以前 
    -ctime    -n +n                #按文件创建时间来查找文件,-n指n天以内,+n指n天以前 
    -nogroup                       #查无有效属组的文件,即文件的属组在/etc/groups中不存在
    -nouser                         #查无有效属主的文件,即文件的属主在/etc/passwd中不存
    -newer   f1 !f2               #查更改时间比f1新但比f2旧的文件
    -type    b/d/c/p/l/f          #查是块设备、目录、字符设备、管道、符号链接、普通文件
    -size      n[c]                 #查长度为n块[或n字节]的文件
    -depth                          #使查找在进入子目录前先行查找完本目录
    -fstype                         #查更改时间比f1新但比f2旧的文件
    -type    b/d/c/p/l/f         #查是块设备、目录、字符设备、管道、符号链接、普通文件
    -size      n[c]                #查长度为n块[或n字节]的文件
    -depth                         #使查找在进入子目录前先行查找完本目录
    -fstype                        #查位于某一类型文件系统中的文件,这些文件系统类型通常可 在/etc/fstab中找到
    -mount                        #查文件时不跨越文件系统mount点
    -follow                        #如果遇到符号链接文件,就跟踪链接所指的文件
    -cpio                %;      #查位于某一类型文件系统中的文件,这些文件系统类型通常可 在/etc/fstab中找到
    -mount                        #查文件时不跨越文件系统mount点
    -follow                        #如果遇到符号链接文件,就跟踪链接所指的文件
    -cpio                          #对匹配的文件使用cpio命令,将他们备份到磁带设备中
    -prune                       #忽略某个目录
    -amin         # 查找在系统中最后N分钟访问的文件
    -mmin             # 查找在系统中最后N分钟里修改过的文件
     

    1.根据文件名查找:-name 可以支持glob风格文件名通配

    用法:find 查找路径 -name 文件名

    ]# find . -name “*.txt”   查找/tmp目录下所有的txt文件
    ./maxusers.txt
    ./we/dd1.txt
    ./we/dd2.txt
    ./we/dd3.txt

    ]# find . -name “[A-Z]*” -print    查找当前目录及子目录中查找文件名以一个大写字母开头的文件
    ./man/man3/Git.3pm.gz
    ./man/man3/Git::I18N.3pm.gz

    ]# find . -name “f*”     查找/tmp目录下以f开头的文件
    ./functions
    ./fenzu
    ./fenz

    ]# find /usr -name “[a-z][0-9]” 查找/usr目录下以小写字母开头,后面跟数字0-9开头的文件
    /usr/bin/m4
    /usr/share/gcc-4.8.2/python/libstdcxx/v6

     

    2.根据文件从属关系查找:

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

    查找/var目录下文件属主为centos用户的所有文件
    ]# find /var -user centos
    /var/spool/mail/centos

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

    查找 /home目录里面属组为nologin的文件
    ]# find /home -group nologin -ls
    6292165 0 drwx—— 2 nologin nologin 76 10月 20 20:55 /home/nologin
    6292166 4 -rw-r–r– 1 nologin nologin 18 9月 7 00:25 /home

    • -uid UID:查找属主指定的UID的所有文件。

    查找/var目录下uid为48的文件
    ]# find /var -uid 48 -ls
    771874 0 drwx—— 2 apache apache 6 10月 12 01:17 /var/lib/dav
    17148123 0 drwx—— 3 apache apache 19 10月 12 01:17 /var/cache/httpd

    • -gid GID:查找属组指定的GID的所有文件。

    查找/var目录下gid为91的文件
    ]# find /var -gid 91 -ls
    17133941 0 drwxr-xr-x 3 root tomcat 21 10月 13 10:30 /var/lib/tomcat
    25354344 0 drwxrwxr-x 2 root tomcat 6 8月 7 12:32 /var/lib/tomcat/webapps

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

    查找/home目录里面没有属主的文件
    ]# find /home -nouser
    /home/mandriva
    /home/mandriva/.bash_logout
    /home/mandriva/.bash_profile
    /home/mandriva/.bashrc

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

    例如:查找/tmp目录里面没有属组的文件
    [root@centOS tmp]# find /tmp -nogroup -ls
    16798173 0 -rw-r–r– 1 root 2050 0 10月 18 17:37 /tmp/fenz

     

    3.根据文件的类型查找,常见的文件类型有如下

    用法:find 查找路径 -type 文件类型
    f: 普通文件
    d: 目录文件
    l:符号链接文件
    b:块设备 文件
    c:字符设备文件
    p:管道文件
    s:套接字文件

    查找/dev目录下的所有块设备
    [root@centOS tmp]# find /dev -type b
    /dev/sda6
    /dev/sda5
    /dev/sda4

    1、找出/tmp目录下属主为非root的所有文件;
    ]# find  .  !  -user  root  -ls   方法1:用!号表示非
    16819217 20 -rw-r–r– 1 dxl distro 17480 10月 21 17:57 ./functions
    17126623 0 drwxr-xr-x 3 dxl root 61 10月 22 18:10 ./we

    ]# find .  -not  -user  oot  -ls   方法2:加-not,表示非
    16819217 20 -rw-r–r– 1 dxl distro 17480 10月 21 17:57 ./functions
    17126623 0 drwxr-xr-x 3 dxl root 61 10月 22 18:10 ./we

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

    ]# find  .  -name  “fstab”   先找出带fstab字符的文件
    ./fstab
    ./fstab222
    ]# find  .  !  -name  “fstab

    3、找出/tmp目录下属主为非root,而且文件名不包含fstab字符串的文件;
    ]# find  .  !  -name  “fstab”  !  -user  root  -ls
    16819217 20 -rw-r–r– 1 dxl distro 17480 10月 21 17:57 ./functions
    17126623 0 drwxr-xr-x 3 dxl root 61 10月 22 18:10 ./we

    组合条件:逻辑表达式
    -a 与:前后条件要通时满足,find默认为这个选项
    -o: 或者
    !,-not:非

     

    4.根据指定的文件的大小查找

    -size  [+|-]指定文件的大小
    

    常用单位有:k(千字节), M(兆字节), G(1024M字节)
    1G=1024M=1024K
    例如:我要在某目录查找并指定为10k的文件,有三种输入方式表示三种不同的查找结果
    10k:查找到的结果为大于9k,小于或等10k的文件
    -10k:查找大于0小于10k的文件
    +10k:查找大于大于10k的文件

    查找/var目录下,查找深度到 2级子目录,大于11k的文件
    ]# find  /var  -maxdepth  2   -size  +11k  -type  f  -exec  ls  -lh  {} ; 
    -rw-r--r--. 1 root root 585K 10月 28 10:32 /var/log/lastlog
    -rw-rw-r--. 1 root utmp 131K 10月 28 10:32 /var/log/wtmp
    .........
    

    5.根据时间戳查找:就是根据文件的修改时间,访问时间,文件属性改变时间来查找文件

    1.以“天”为单位:
    find  查找目标   -atime  [+|-]n   

    “4” :4天前的那一天,表示查找第5天00:00到23.59分59秒创建的文档
    “-4” :表示查找小于等于过去4天内的文档
    “+4” :查找大于等于过去5天的文件

    查找/var目录内过去4天内的修改过的文件
    ]# find  /var   -mtime  -4 -exec ls   -rlt {} ;           
    
    

    以“分钟”为单位:
    -amin
    -mmin
    -cmin

     

    6.根据权限查找:

    -perm  [/|-]mode
    
    • mode:精确权限匹配,按给出的权限进行精确查找
    
    ]# find . -perm 646 -exec ls -l {} ;    
    -rw-r--rw-. 1 root root 0 10月 28 12:58 ./ddd.txt
    
    • /mode:权限前加斜线,任何一类用户(u,g,o)的权限中的任何一位(r,w,x)符合条件即满足,权限之间存在“或”关系。
    要查找权限位的其他人有写权限的文件,
    ]# find  . -perm  /002  -exec  ls  -l  {}  ;   
    -rw-r--rw-. 1 root root 0 10月 28 12:58 ./ddd.txt
    -rw-r--rw-. 1 root root 0 10月 28 12:58 ./ddd.txt
    ]# find  . -perm  /222  -exec  ls  -l  {}  ;    查找任何有写入权限的文件
    总用量 0
    -rw-r--rw-. 1 root root  0 10月 28 12:58 ddd.txt
    drwxr-xr-x. 2 root root 38 10月 28 13:00 dir1
    ..........
    说明:第一个实例/002,表示只对其他用户的权限位的写权限进行查找。
    002就是不进行属主和属组的权限位进行查找的意思。
    但是在centos6上面有区别,centos6上/002也可以用+002表示,centos7上面find不再使用+号。
    centos6上/002表示任意权限位存在写入的都会找到
    
    • -mode:每一类用户(u,g,o)的权限中的每一位(r,w,x)同时符合条件即满足,权限之间存在“与”关系。
    
    ]# find . -perm -664 -exec ls -l {} ;
    -rw-rw-rw-. 1 root root 0 10月 28 12:58 ./ddd.txt
    

    处理动作:对find查找出的的结果进行的一列处理,例如删除,复制等。

    • -print:输出至标准输出;默认的动作
    • -ls:类似于对查找到的文件执行“ls -l”命令,输出文件的详细信息;
    • -delete:删除查找到的文件;
    • -fls /PATH/TO/SOMEFILE:把查找到的所有文件的长格式信息保存至指定文件中;
    • ok COMMAND {} ; :对查找到的每个文件执行由COMMAND表示的命令;每次操作都由用户进行确认;
    • -exec COMMAND {} ; :对查找到的每个文件执行由COMMAND表示的命令;

    注意:find传递查找到的文件路径至后面的命令时,是先查找出所有符合条件的文件路径,并一次性传递给后面的命令;
    但是有些命令不能接受过长的参数,此时命令执行会失败;另一种方式可规避此问题:
    find | xargs COMMAND
    xargs命令通俗来讲就是将标准输入转成各种格式化的参数,所以命令[command 1] | xargs [command 2]就是将command 1的标准输出结果,通过管道|变成xargs的标准输入,然后xargs再将此标准输入变成参数,传给[command 2]。这样一来,通过xargs命令,我们便可以在管道后面使用那些不接收标准输入的命令了。例如[command 1]|xargs ls。

     

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

    ]# find  /var  -user  root  -group  mail  -ls

    8446487 0 drwxrwxr-x 2 root mail 260 10月 29 11:48 /var/spool/mail
    9436072 4 -rw——- 1 root mail 680 10月 29 11:48 /var/spool/mail/root

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

    ]# find /usr -not ( -user root -o -user bin -o -user hadoop ) -ls   注意小括号前后的空格

    ]# find /usr -not -user root -not -user bin -not -user hadoop -ls

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

    ]# find /etc -mtime -7 -a -not ( -user root -o -user hadoop ) -ls

    ]# find /etc -mtime -7 -a -not -user root -a -not -user hadoop -ls

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

    ]# find / ( -nouser -o -nogroup ) -atime -7 -ls

    82 0 drwx—— 2 1006 distro 62 10月 3 17:35 /home/mandriva
    4215538 0 drwx—— 2 we55 2050 76 10月 24 11:33 /home/we55
    4215539 4 -rw-r–r– 1 we55 2050 18 9月 7 00:25 /home/we55/.bash_logout
    ……..

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

    ]# find /etc -size +1M -type f -exec ls -lh {};

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

    ]# find /etc -not -perm /222 -type f -ls

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

    ]# find /etc -not -perm -111 -type f -ls

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

    ]# find /etc -perm -113 -type f -ls

    9、查找/test下的.txt的普通文件,不查找子目录。

    ] # find /test ! -name “test” -type d -prune -o -type f -name “*.txt” -print

    查找当前目录下的普通文件,不查找子目录

    ] # find . ! -name “.” -type d -prune -o -type f -print

    -maxdepth<目录层级>:设置最大目录层级; -mindepth<目录层级>:设置最小目录层级,设定查找目标的目录查找层级,有利于加快查找速度。
    例如:查找/etc一级目录下的所有txt文件,不查找子目录里面的文件。
    -prune 排除指定某个不要进行查找的目录

  • 相关阅读:
    MDX Step by Step 读书笔记(六) Building Complex Sets (复杂集合的处理) Filtering Sets
    在 Visual Studio 2012 开发 SSIS,SSAS,SSRS BI 项目
    微软BI 之SSIS 系列 在 SSIS 中读取 SharePoint List
    MDX Step by Step 读书笔记(五) Working with Expressions (MDX 表达式) Infinite Recursion 和 SOLVE_ORDER 原理解析
    MDX Step by Step 读书笔记(五) Working with Expressions (MDX 表达式)
    使用 SQL Server 2012 Analysis Services Tabular Mode 表格建模 图文教程
    MDX Step by Step 读书笔记(四) Working with Sets (使用集合) Limiting Set and AutoExists
    SQL Server 2012 Analysis Services Tabular Model 读书笔记
    Microsoft SQL Server 2008 MDX Step by Step 学习笔记连载目录
    2011新的开始,介绍一下AgileEAS.NET平台在新的一年中的发展方向
  • 原文地址:https://www.cnblogs.com/RXDXB/p/11696751.html
Copyright © 2020-2023  润新知