介绍
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占的权限位不考虑。
一个对象拥有的权限由三类权限组成,分别是r、w、x。
处理动作
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 目录下不属于 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 \)
3、查找 /etc 目录下最近一周内修改过且属主不是 root 和 hadoop 的文件和目录。
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
评论区