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

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. android 项目集成 微信支付

    0.环境 下载 libammsdk.jar 1.需要的常量值 public class Constant { /** 微信中用到的常量值 */ public static final class WX ...

  2. 一步一步写News App(一)

    一. 新建一个安卓工程,安卓版本全部选2.3.3 二.第一步,添加一个tabhost控件 在MainActivity中声明TabHost tabHost; 然后新建一个private void ini ...

  3. docker系列七之Dockerfile

    Dockerfile 一. Dockerfile是什么   Dockerfile是docker中镜像文件的的描述文件,说的直白点就是镜像文件到底是由什么东西一步步构成的.例如我们在淘宝上买了一件商品, ...

  4. form表单提交后结果乱码的解决方法

    1.产生乱码原因:表单提交使用的method="get",get方式数据都是通过地址栏传输,数据会以iso-8859-1方式传输,因此产生乱码 2.概念:URI: Uniform ...

  5. linux centos安装nginx1.7.4

    原文转自 jerryhe326:https://www.cnblogs.com/jerrypro/p/7062101.html一.安装准备 首先由于nginx的一些模块依赖一些lib库,所以在安装ng ...

  6. wakelock查看

    Android的wakelock分为两层 待机异常https://wenku.baidu.com/view/6b765c8802020740be1e9bd8.html Linux层和应用层 查看Lin ...

  7. 初级文件IO——IO过程、open、close、write、read、lseek、dup、dup2、errno、perror

    先要回答的问题 文件IO指的是什么? 本文主要讲述如何调用Linux OS所提供的相关的OS API,实现文件的读写. 如何理解文件IO? IO就是input output的意思,文件io就是文件输入 ...

  8. centos7下安装zookeeper&zookeeper集群的搭建

    一.centos7下安装zookeeper 1.zookeeper 下载地址 https://mirrors.tuna.tsinghua.edu.cn/apache/zookeeper/ 2.安装步骤 ...

  9. webpack中配置eslint

    首先安装eslint npm install eslint --save-dev 安装好这个工具后,初始化eslint npx eslint --init 这个时候会自动生成.eslintrc.js ...

  10. 2018牛客网暑期ACM多校训练营(第二场)I- car ( 思维)

    2018牛客网暑期ACM多校训练营(第二场)I- car 链接:https://ac.nowcoder.com/acm/contest/140/I来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 ...