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

locate :依赖于事先构建的索引,索引的构建是在系统较为空闲时自动进行(周期性任务)

手动更新数据库(updatedb)

  • 非实时查找

  • 模糊查找
  • 索引构建过程需要遍历整个根文件系统,极消耗资源

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 根据文件名查找

  -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 根据文件从属关系查找

  -user  USERID :查找属主为指定用户的文件;
  
  -group GROUPID:查找属组的文件;
  -uid UID :查找属主为指定的UID号的文件
  -gid GID :查找属组为指定的GID号的文件
  -nouser :查找没有属主的文件
  -nogroup :查找没有属组的文件
find  /data -user root  -ls
find /data -gid 1001
find /data \(-nouser -o -nogroup \) -ls 属主不是root,且文件名不是fstab的文件
find /tmp \(-not -user "root" -a -not -name "/fstab"\) -ls
find  /tmp -not \(-user "root" -o  -name "/fstab"\) -ls

1.3组合条件

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

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



1.4 -type 根据文件类型查找

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

1.5 -size 根据文件大小查找

-size [+|-] #UNIT
常用单位:k、m、G、c(byte)   #UNIT: (#-1,#]
  -UNIT : [0, #-1]
  +UNIT : (#, ∞)
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字节的文件 find /var -size -3k -exec ls -lh {} \

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

以“天”为单位:

  • -atime [+|-] #

    • #: [#,#+1)     5天
    • -#:[0,#)         5天以内
    • +#:[#+1, ∞]   5天以前
  • -mtime [+|-] #
  • -ctime [+|-] #
    ***
    以“分钟”为单位:
  • -amin
  • -mmin
  • -cmin

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

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

1.8 -perm 按文件权限查找 (隐含:只要包含有要求部分都匹配)

-perm  [/|-]mode  注:centos 7上findutils-4.5.12 以后使用 -perm “/mode”取代了“+”
mode:精确权限匹配;比如111 即只匹配 --x--x--x的所有文件
/mode:任何一类用户(u,g,o)的权限中的任何一位(r,w,x)符合条件即满足;9位权限之间存在“或”关系;
      111 三组权限中只要包含有一个-x及其以上的都匹配出来
-mode:每一类用户(u,g,o)的权限中的每一位(r,w,x)同时符合条件即满足;9位权限之间存在“与”关系;
      111 三组权限中只有都包含-x的匹配出来

0 表示不关心
示例:
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权限

2.处理动作:

  • -print:默认的处理动作,显示至屏幕
  • -ls:类似于对查找到的文件执行“ls -l”命令
  • -delete:删除查找到的文件
  • -fls file:查找到的所有文件的长格式信息保存至指定文件中
  • -ok COMMAND {} \;  :对查找到的每个文件执行由COMMAND指定的命令,
    •   对于每个文件执行命令之前,都会交互式要求用户确认
  • -exec COMMAND {} \; :对查找到的每个文件执行由COMMAND指定的命令;
    **注意:{} 用于引用查找到的文件名称自身** ; \  :exec命令固用的格式

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

七、find 文件查找的更多相关文章

  1. 文件查找和比较命令 来自: http://man.linuxde.net/find

    文件查找和比较1.find命令,用来在指定目录下查找文件.任何位于参数之前的字符串都将被视为欲查找的目录名.如果使用该命令时不设置任何参数,则find命令则在当前目录下查找子目录与文件.并且将查到的子 ...

  2. Linux命令详解1--文件和目录管理之文件查找和比较

    1. 文件查找 1.1 strings命令 ------- 在对象文件或二进制文件中查找可打印的字符串.字符串是4个或更多可打印的任意序列,以换行或空字符结束. strings命令对识别随机对象文件很 ...

  3. 除虫记——有关WindowsAPI文件查找函数的一次压力测试

    作者:朱金灿 来源:http://blog.csdn.net/clever101 这里说的除虫是指排除bug的意思.今天排除了一个有意思的bug,其中的场景大致是这样的:现在你要统计一个文件夹下非隐藏 ...

  4. Linux文件查找find和locate

    目 录 第1章 locate文件查找    1 1.1 概述    1 1.2 locate文件查找的特性    1 第2章 文件查找概述    1 第3章    1 3.1 文件名查找    1 3 ...

  5. Linux基础文件查找

    一.文件查找 (一).命令文件 [root@linux ~]# chich ls //从PATH环境变量 [root@linux ~]# chereis vim [root@linux ~]# ech ...

  6. linux文件查找工具——locate,find

    一文件查找介绍 文件的查找就是在文件系统上查找符合条件的文件. 文件查找的方式:locate, find非实时查找也就是基于数据库查找的locate,效率特别高. 实时查找:find 二locate ...

  7. Linux文件查找.md

    Linux 文件查找 在Linux系统的查找相关的命令: which 查看可执行文件的位置 whereis 查看文件的位置 locate 配合数据库查看文件位置 find 实际搜寻硬盘查询文件名称 w ...

  8. myeclipse学习总结三(MyEclipse文件查找技巧)

    一.查找文件 使用快捷键[ctrl+shift+R]弹出弹出文件查找框,如下图所示: 二.查找包含某个字符串的文件 使用快捷键[ctrl+H]在弹出对话框中选File Search选项,然后在第一个文 ...

  9. 自己动手写文件查找,字符串查找,查询jar包等工具

    文件查找——搜索当前目录下的文件 知道大概的文件名称,使用 findf FileName findf.py import argparse, re, os from os.path import jo ...

随机推荐

  1. (三)调用web服务

    (二)发布第一个WebService服务与DSWL文档解析讲解了如何发布一个web服务,本章主要讲述如何调用一个web服务. 这里有三种方式: 使用代理模式调用,需要将服务端的接口类拷贝到客户端中.( ...

  2. JSP开发 路径问题汇总

    //第一种 jsp 表达式 <%=request.getContextPath %> 获取到 web项目名的绝对路径 <!--使用绝对路径的方式引入CSS文件--> <l ...

  3. class类 - static

    不需要实例化类,即可直接通过该类来调用的方法,即称之为"静态方法".将类中的方法设为静态方法也很简单,在方法前加上static关键字即可.这样该方法就不会被实例继承! class ...

  4. Struts2系列漏洞起始篇

    前言 到目前位置struts2的漏洞编号已经到了S2-057,一直想系统的学习下Struts2的漏洞,但由于工作量较大,一直搁浅.最近由于工作需要,借此机会来填下坑.个人认为一个框架漏洞出来了仅仅看下 ...

  5. Flutter 自定义绘制 View

    在 Flutter 中自定义 View 有两种方式: 组合已有控件 自定义绘制 如何自定义绘制 有两个类做这件事情: CustomPaint :会在绘制阶段提供一个 Canvas 画布 CustomP ...

  6. 如何用HAProxy+Nginx实现负载均衡

    一.什么是HAProxy HAProxy提供高可用性.负载均衡以及基于TCP和HTTP应用的代理,支持虚拟主机,它是免费.快速并且可靠的一种解决方案.HAProxy特别适用于那些负载特大的web站点, ...

  7. spring 时间格式问题

    注解@JsonFormat主要是后台到前台的时间格式的转换 注解@DateTimeFormat主要是前后到后台的时间格式的转换 @DateTimeFormat(pattern = "yyyy ...

  8. Computer Vision_18_Image Stitching: Image Alignment and Stitching——2006

    此部分是计算机视觉部分,主要侧重在底层特征提取,视频分析,跟踪,目标检测和识别方面等方面.对于自己不太熟悉的领域比如摄像机标定和立体视觉,仅仅列出上google上引用次数比较多的文献.有一些刚刚出版的 ...

  9. 企业级自动化运维工具应用实战ansible

    公司计划在年底做一次大型市场促销活动,全面冲刺下交易额,为明年的上市做准备.公司要求各业务组对年底大促做准备,运维部要求所有业务容量进行三倍的扩容,并搭建出多套环境可以共开发和测试人员做测试,运维老大 ...

  10. CentOS 8 (1905)系统安装

    本章内容: CentOS 8 的安装(CentOS-8-1905) 一.安装光盘,选择Install CentOS Linux 8.0.1905 二.选择系统语言,我这里选的是英文,也可以选择中文,往 ...