• find详解


    find详解

    实时查找工具,通过遍历指定起始路径下文件系统层级结构完成文件查找;可以指定一些匹配条件,如按文件名、文件类型、用户甚至是时间戳查找文件。具有以下几个特点:

    • 查找速度略慢
    • 精确查找
    • 实时查找
    • 可能只搜索用户具备读取和执行权限的目录
    find [-H] [-L] [-P] [-D debugopts] [-Olevel] [path...] [expression]
    find  [OPTION]... [查找路径]  [查找条件]  [处理动作]
    # 查找路径:指定具体目标路径;默认为当前目录
    # 查找条件:指定的查找标准,可以文件名、大小、类型、权限等标准进行;默认为找出指定路径下的所有文件
    # 处理动作:对符合条件的文件做操作,默认输出至屏幕
    比如:
    find /var -user root -a -group mail -ls  #表示查找/var目录下属主为root同时属组为mail的文件,并ll出来
    

    1.常用选项

    1.1 -name,-iname 根据文件名查找

    find  /etc  -iname "a[mmp]*.conf"  #表示在/etc目录下和寻找以a开头,第二个字符为m/n/p,同时以.conf结尾的文件;文件名不区分大小写
    -regex pattern:基于正则表达式模式查找文件,匹配是整个路径,而非其名;
    

    回顾文件glob通配符:

    • *:匹配一个路径部分中0个或多个字符,注意不匹配以.开始的路径,如文件.a
    • ?:匹配单个字符
    • [abc]:匹配列表中abc的任何字符
    • [^abc]:匹配出列表abc外的任何字符
    • [0-9]:匹配数字范围

    1.2 -user,-group,-uid,-gid,-nouser,-nogroup 根据文件从属关系查找

    find  /data -user root  -ls
    find /data -gid 1001 
    find /data nouser 
    

    1.3 -type 根据文件类型查找

    find /etc  -type f   -name  "passwd"   #查找/etc下名字为passwd的普通文件 
    
    # type:
    	f: 普通文件
    	d:目录文件
    	l:符号链接(软链接)文件
    	b:块设备文件
    	c:字符设备文件
    	p:管道文件
    	s:套接字文件
    

    1.4 -size 根据文件大小查找

    -size [+|-] #UNIT
    	常用单位:k、m、G、c(byte)
    find  /data  -size  6k    # 表示(5k,6k] 大于5k小于等于6k
    find  /data  -size  -6k   # 表示(0k,5k] 
    find  /data  -size  +6k   # 表示(6k,∞)大于5k小于等于6k
    find . -size +1000000c    # 在当前目录下查找文件长度大于1 M字节的文件 
    find /home/apache -size 100c # 在/home/apache目录下查找文件长度恰好为100字节的文件 
    

    1.5 -atime,ctime,mtime;-amin,-cmin,-mmin 按时间查找

    以“天”为单位:

    • -atime [+|-] #
      • #: 5天
      • -#:5天以内
      • +#:5天以前
    • -mtime [+|-] #
    • -ctime [+|-] #

    以“分钟”为单位:

    • -amin
    • -mmin
    • -cmin

    1.6 -maxdepth,-mindepth 按文件层级查找

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

    1.7 -perm 按文件权限查找

    -perm  [/|-]mode
    	mode:精确权限匹配;
    	/mode:任何一类用户(u,g,o)的权限中的任何一位(r,w,x)符合条件即满足;9位权限之间存在“或”关系;
    	-mode:每一类用户(u,g,o)的权限中的每一位(r,w,x)同时符合条件即满足;9位权限之间存在“与”关系;
    
    示例:
    find . -perm /220 
    find . -perm /u+w,g+w
    find . -perm /u=w,g=w
    以上的3个都表示:查找满足:1属组拥有w权限;组拥有w权限;其他人无任何权限。这个3个条件满足其一
    find . -perm -444 -perm /222 ! -perm /111  
    find . -perm -a+r -perm /a+w ! -perm /a+x    
    以上两个都表示:全部用户都有r权限,全部用户都没有x权限,至少一类用户拥有w权限
    

    1.8组合条件

    • 与:-a
    • 或:-o
    • 非:-not或!

    延伸:
    德·摩根定律:
    (非 A) 或 (非 B) = 非(A 且 B)
    (非 A) 且 (非 B) = 非(A 或 B)
    示例:
    !A -a !B = !(A -o B)
    !A -o !B = !(A -a B)

    2.处理动作:

    • -print:默认的处理动作,显示至屏幕
    • -ls:类似于对查找到的文件执行“ls -l”命令
    • -delete:删除查找到的文件
    • -fls file:查找到的所有文件的长格式信息保存至指定文件中
    • -ok COMMAND {} ; 对查找到的每个文件执行由COMMAND指定的命令,对于每个文件执行命令之前,都会交互式要求用户确认
    • -exec COMMAND {} ; :对查找到的每个文件执行由COMMAND表示的命令;
      **注意:{} 用于引用查找到的文件名称自身**
    find /tmp  -iname  ".conf"  -ok rm -rf {}    
    find /etc  -perm  -111  -exec  -mv  {}  /data  
    
    find ~ -perm -002 -exec chmod o-w {}      #
    
    

    3.find与xargs

    1、在使用find命令的-exec选项处理匹配到的文件时, find命令将所有匹配到的文件一起传递给exec执行。但有些系统对能够传递给exec的命令长度有限制,这样在find命令运行几分钟之后,就会出现溢出错误。错误信息通常是“参数列太长”或“参数列溢出”。这就是xargs命令的用处所在,特别是与find命令一起使用。
    如:find /sbin -perm /700 | ls -l 这个命令由于find搜出的结果过多,无法执行
    正确:find /sbin -perm +700 | xargs ls -l
    2、xargs用于产生某个命令的参数,xargs 可以读入 stdin 的数据,并且以空格符或回车符将 stdin 的数据分隔成为arguments。也就是说find命令把匹配到的文件传递给xargs命令,而xargs命令每次只获取一部分文件而不是全部,不像-exec选项那样。这样它可以先处理最先获取的一部分文件,然后是下一批,并如此继续下去。

    示例:
    find -name “*.conf” -exec cp {} {}.orig ;   # 备份配置文件,添加.orig这个扩展名
    
    find /tmp -ctime +3 -user joe -ok rm {}    
    find /tmo -ctime +3 -user joe | xargs rm -rf   # 删除存在时间超过3天以上的joe的临时文件
    
    find ~ -perm -002 -exec chmod o-w {} ;
    find ~ -perm -002 | xargs chmod o-w  #家目录中寻找其他用户只有写权限的文件并将该权限去掉
    

    注意:find -name “*.conf” -exec cp {} {}.orig ; 最后别忘了;结尾 与前一个单词间留出空格

    注意2:管道| 与 -exec 的区别,管道是将左侧的输出作为右侧的输入;而-exce 是将find找到文件再通过-exce 命令去执行操作;

    find -name  "file*" -exec  wc -w  {}  ;   # 对搜到的每一个文件进行wc命令操作
    find -name "file*" | wc -w     # 而管道符是将find搜到的作为一个文本整体进行wc操作,也可以得到正常的结果
    

    4.locate 非实时查找(数据库查找)

    locate - find files by name
    locate [OPTION]... PATTERN...

    查询系统上预建的文件索引数据库:/var/lib/mlocate/mlocate.db
    依赖于事先构建的索引,索引的构建是在系统较为空闲时自动进行(周期性任务),管理员手动更新数据库(updatedb)
    索引构建过程需要遍历整个根文件系统,极消耗资源

    特点:

    • 查找速度快
    • 模糊查找
    • 非实时查找
    • 搜索的是文件的全路径,不仅仅是文件名
    • 可能只搜索用户具备读取和执行权限的目录
    locate [OPTION]... PATTERN...
    # option
    	-i 不区分大小写的搜索
    	-n N 只列举前N个匹配项目
    	-r 使用正则表达式
    示例:
    locate conf   # 搜索名称或路径中带有“conf”的文件
    locate -r ‘.conf$’  # 使用Regex来搜索以“.conf”结尾的文件
    

    5.练习:

    1、查找/var目录下属主为root,且属组为mail的所有文件或目录;
    ~]# find /var -user root -a -group mail -ls

    2、查找/usr目录下不属于root, bin或hadoop的所有文件或目录;用两种方法;
    ~]# find /usr -not -user root -a -not -user bin -a -not -user hadoop
    ~]# find /usr -not ( -user root -o -user bin -o -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

    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

  • 相关阅读:
    35美元的树莓派电脑 黑客就偷走了NASA的火星数据
    博客样式保留
    某社交网站XSS小计
    c# WhereIf 扩展
    SQL、Linq、lamda表达式 同一功能不同写法
    tomcat org.apache.coyote.http11.HeadersTooLargeException: 尝试将更多数据写入响应标头,而不是缓冲区中有可用空间。 增加连接器上的maxHttpHeaderSize或将更少的数据写入响应头。
    Maven Dependency Scopes
    为什么mysql中不应该使用utf8编码
    springmvc dispacher中的url-pattern的/和/*区别
    在jsp中java代码中警告Cannot resolve method "XX"
  • 原文地址:https://www.cnblogs.com/sstjustdoit/p/9998314.html
Copyright © 2020-2023  润新知