侧边栏壁纸
博主头像
张种恩的技术小栈博主等级

行动起来,活在当下

  • 累计撰写 747 篇文章
  • 累计创建 65 个标签
  • 累计收到 39 条评论

目 录CONTENT

文章目录

Linux基础(29)之find命令详解

zze
zze
2019-10-22 / 0 评论 / 0 点赞 / 588 阅读 / 9588 字

不定期更新相关视频,抖音点击左上角加号后扫一扫右方侧边栏二维码关注我~正在更新《Shell其实很简单》系列

介绍

find命令概述

find 命令是 Linux 系统中查找文件的命令,最大的作用是帮助用户在使用 Linux 系统时能快速的找出符合指定条件的文件。

非实时查找和实时查找

非实时查找

非实时查找在某些时候也叫做数据库查找或索引查找,在 Linux 系统中会有一个生成数据库(索引库)的计划,非实时查找就是在事先生成好的数据库(索引库)中查找。在 Linux 中可使用 locate 命令来进行非实时查找。
非实时查找的特点:

  • 依赖于事先构建的索引,索引的构建是在系统较为空间时自动进行的(周期性你任务),如果需要手动更新索引则可执行 updatedb 命令;
  • 索引构建过程中需要从根目录开始遍历整个文件系统,及其消耗资源,谨慎使用;
  • 非实时查找的查找速度快,使用的模糊查找(文件全路径包含指定字符串即匹配);

locate 命令的使用也很简单,以查询全路径中包含 passwd 的目录和文件路径为例:

[root@localhost ~]# locate passwd
/etc/passwd
/etc/passwd-
/etc/pam.d/passwd
/etc/security/opasswd
/usr/bin/gpasswd
/usr/bin/grub2-mkpasswd-pbkdf2
...

实时查找

实时查找与非实时查找相对应,表示即时遍历指定路径下的文件系统从中查找指定条件的文件,在 Linux 系统中可使用 find 命令来进行实时查找,这也是本篇文章的主要内容。
实时查找的特点:

  • 实时查找的查找速度略慢,并且是精确查找(仅使用文件名做匹配);

find命令使用

语法格式

find [OPTION] ... [查找路径] [查找条件] [处理动作]
    查找路径:具体查找的目标路径,默认为当前目录;
    查找条件:指定的查找标准,可以以文件名、大小、类型、权限等标准进行,默认为查找出指定路径下的所有文件;
    处理动作:对符合条件的文件做什么操作,默认为输出至终端;

支持选项

根据文件名查找

  • -name <FILENAME>:根据文件名称查找,支持使用 glob;
  • -iname <FILENAME>:同 -name,只是它忽略大小写;
  • -regex <PATTERN>:以 PATTERN 指定的模式来匹配整个文件路径字符串进行查找,不仅仅匹配文件名称哦;

根据属主或属组查找

  • -user <USERNAME>:查找属主为指定用户的文件;
  • -group <GROUPNAME>:查找属组为指定组的文件;
  • -uid <UID>:查找属主为指定 UID 号的文件;
  • -gid <GROUPID>:查找属组为指定 GID 号的文件;
  • -nouser:查找没有属主的文件;
  • -nogroup:查找没有属组的文件;

根据文件类型查找

  • -type f:普通文件;
  • -type d:目录文件;
  • -type l:符号链接文件;
  • -type s:套接字文件;
  • -type b:块设备文件;
  • -type c:字符设备文件;
  • -type p:管道文件;

根据文件大小查找

使用格式:

-size [+|-]#UNIT
    #:常量
    UNIT:单位,可选值有 k、M、G
  • -size #UNIT:表示查找大小在 (#-1,#] 区间单位为 UNIT 的文件。例:-size 3k 则是查找 >2k<=3k 的文件;
  • -size -#UNIT:表示查找大小在 [0,#-1] 区间单位为 UNIT 的文件。例:-size -3k 则是查找 >=0k<=2k 的文件;
  • -size +#UNIT:表示查找大小在 (#,∞) 区间单位为 UNIT 的文件。例:-size +3k 则是查找 >3k 的文件;

根据时间戳查找

根据时间戳查找有如下两组选项:

以“天”为单位:
    -atime [+|-]#
    -mtime [+|-]#
    -ctime [+|-]#
以“分钟”为单位:
    -amin [+|-]#
    -mmin [+|-]#
    -cmin [+|-]#
    
#:常量
以 -a 开头则表示以访问时间过滤;
以 -m 开头则表示以修改时间过滤;
以 -c 开头则表示以改变时间过滤;

关于几种时间戳的介绍可查看 http://zze.xyz/article/253.html#_label3

  • -atime #:表示查找访问时间范围在 [#,#+1) 天内的文件。例:-atime 3 则是查找访问时间在 3 天之前不到 4 天的文件;
  • -atime +#:表示查找访问时间范围在 (#+1,∞] 天内的文件。例:-atime +3 则是查找访问时间在 4 天之前的文件;
  • -atime -#:表示查找访问时间范围在 [0,#) 天内的文件。例 -atime -3 则是查找访问时间在最近 3 天内的文件;
  • -mtime #:表示查找修改时间范围在 [#,#+1) 天内的文件。例:-mtime 3 则是查找修改时间在 3 天之前不到 4 天的文件;
  • -mtime +#:表示查找修改时间范围在 (#+1,∞] 天内的文件。例:-ntime +3 则是查找修改时间在 4 天之前的文件;
  • -mtime -#:表示查找修改时间范围在 [0,#) 天内的文件。例 -mtime -3 则是查找修改时间在最近 3 天内的文件;
  • -ctime #:表示查找改变时间范围在 [#,#+1) 天内的文件。例:-mtime 3 则是查找改变时间在 3 天之前不到 4 天的文件;
  • -ctime +#:表示查找改变时间范围在 (#+1,∞] 天内的文件。例:-ntime +3 则是查找改变时间在 4 天之前的文件;
  • -ctime -#:表示查找改变时间范围在 [0,#) 天内的文件。例 -mtime -3 则是查找改变时间在最近 3 天内的文件;
  • -amin #:表示查找访问时间范围在 [#,#+1) 分钟内的文件。例:-amin 3 则是查找访问时间在 3 分钟之前不到 4 分钟的文件;
  • -amin +#:表示查找访问时间范围在 (#+1,∞] 分钟内的文件。例:-amin +3 则是查找访问时间在 4 分钟之前的文件;
  • -amin -#:表示查找访问时间范围在 [0,#) 分钟内的文件。例 -amin -3 则是查找访问时间在最近 3 分钟内的文件;
  • -mmin #:表示查找修改时间范围在 [#,#+1) 分钟内的文件。例:-mmin 3 则是查找修改时间在 3 分钟之前不到 4 分钟的文件;
  • -mmin +#:表示查找修改时间范围在 (#+1,∞] 分钟内的文件。例:-nmin +3 则是查找修改时间在 4 分钟之前的文件;
  • -mmin -#:表示查找修改时间范围在 [0,#) 分钟内的文件。例 -mmin -3 则是查找修改时间在最近 3 分钟内的文件;
  • -cmin #:表示查找改变时间范围在 [#,#+1) 分钟内的文件。例:-mmin 3 则是查找改变时间在 3 分钟之前不到 4 分钟的文件;
  • -cmin +#:表示查找改变时间范围在 (#+1,∞] 分钟内的文件。例:-nmin +3 则是查找改变时间在 4 分钟之前的文件;
  • -cmin -#:表示查找改变时间范围在 [0,#) 分钟内的文件。例 -mmin -3 则是查找改变时间在最近 3 分钟内的文件;

根据权限查找

使用格式:

-perm [/|-]MODE
    MODE:要匹配的权限,由八进制数组成;
  • -perm MODE:表示查找权限能精确匹配为 MODE 的文件,例:-perm 600 则表示查找权限对应八进制为 600 的文件;
  • -perm /MODE:表示查找任一对象(u、g、o)权限能包含 MODE 中对应对象权限的任何一类权限的文件,例:-perm /642 则表示查找属主拥有读或写权限、或属组拥有读权限、或其它用户拥有写权限的文件,而 -perm /003 则表示查找其它用户拥有写或执行权限的文件;
  • -perm -MODE:表示查找每一对象(u、g、o)权限都包含 MODE 中对应对象权限的所有权限的文件,例:-perm /642 则表示查找属主拥有读和写权限、属组拥有读权限且其它用户拥有写权限的文件,而 -perm -003 则表示查找其它用户拥有写和执行权限的文件;

使用 /MODE-MODE 查找时指定的参数中 0 占的权限位不考虑。
一个对象拥有的权限由三类权限组成,分别是 rwx

处理动作

find 命令最后还可跟一个处理动作命令,用来对查找到的文件进行操作,如下:

  • -print:默认的处理动作,以 ls 的方式显示查找到的文件;
  • -ls:以 ls -l 的方式显示查找到的文件;
  • -delete:删除查找到的文件;
  • -fls <FILE>:将查找到的结果以 ls -l 显示的格式保存到指定的 PATH 文件中;
  • -ok COMMAND {} \;:对查找到每个文件执行由 COMMAND 指定的命令,对每个文件执行 COMMAND 命令之前都会交互式的要求用户确认;
  • -exec COMMAND {} \;:对查找到每个文件执行由 COMMAND 指定的命令;

注意:find 命令传递查找到的文件到后面指定的命令时,是先查找到所有符合条件的文件然后一次性将这些文件传递给后面的命令。有些命令不能接受过多参数,此时命令执行可能会失败。
使用 find | xargs COMMAND 的方式可规避此问题,此种方式的类似与迭代器,会将文件一个一个传递给 COMMAND 命令执行。

-ok-exec 中的 {} 可以引用到查找到的文件,如给当前目录下的每个文件后添加一个 .test 后缀,则可执行一下命令:

find * -exec mv {} {}.test \;

组合条件

find 命令支持使用类似条件测试的逻辑连接字符来组合条件,如下:

  • -a:与连接;
  • -o:或连接;
  • -not:非连接;

例:找出 .tmp 目录下,属主不是 root,且文件名不是 fstab 的文件。

find /tmp \( -not -user root -a -not -name 'fstab' \) -ls
也可将取反的 -not 提取到括号外:
find /tmp -not \( -user root -o -name 'fstab' \) -ls

注意:

  • find 命令中的括号 ( 要使用 \转义;
  • -o-a 都是直接针对两边所有内容的,所以上述示例不能这样写 find /tmp -not -user root -a -not -name 'fstab' -ls,这样写的结果是 ls 只是针对 -a 右边的内容,而并不是针对 -a 两边条件过滤后的内容;

练习

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

find /var -user root -group mail

多个条件为且关系时,-a 可以省略。

2、查找 /usr 目录下不属于 rootbinhadoop 的所有文件和目录。

find /usr/ -not -user root -a -not -user bin -a -not -user hadoop
find /usr/ -not \( -user root -o -user bin -o user hadoop \)

3、查找 /etc 目录下最近一周内修改过且属主不是 roothadoop 的文件和目录。

find /etc -mtime -7 -a -not -user root -not -user hadoop
find /etc -mtime -7 -a -not \( -user root -o -user hadoop \)

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

find / \( -nouser -o -nogroup \) -a -atime -7 

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

find /etc -size +1M -type f

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

find /etc -not -perm /222

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

find /etc -not -perm -222

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

find /etc/init.d -perm -111 -a -perm /002
find /etc/init.d -perm -113
0

评论区