find命令详解

find详解

find目的:查找符合条件的文件

1
格式:find    目录名      选项      查找条件

find是我们很常用的一个Linux命令,但是我们一般查找出来的并不仅仅是看看而已,还会有进一步的操作,这个时候exec的作用就显现出来了。

exec解释:-exec参数后面跟的是command命令,它的终止是以;为结束标志的,所以这句命令后面的分号是不可缺少的,考虑到各个系统中分号会有不同的意义,所以前面加反斜杠。

{} 花括号代表前面find查找出来的文件名。

使用find时,只要把想要的操作写在一个文件里,就可以用exec来配合find查找,很方便的。在有些操作系统中只允许-exec选项执行诸如ls或ls l这样的命令。大多数用户使用这一选项是为了查找旧文件并删除它们。建议在真正执行rm命令删除文件之前,最好先用ls命令看一下,确认它们是所要删除的文件。 exec选项后面跟随着所要执行的命令或脚本,然后是一对儿{},一个空格和一个\,最后是一个分号。为了使用exec选项,必须要同时使用print选项。如果验证一下find命令,会发现该命令只输出从当前路径起的相对路径及文件名。

find工具

一、工作特点

优点

实时查找

准确查找,遍历整个目录下的所有文件

可以对查询到的文件进行指定动作,即查看,删除,移动等操作.

缺点

查询速度略慢

查询条件

查询条件由选项及测试条件组成:

【测试条件】

一、以文件名查找

1
2
3
1.-name pattern:以文件名查找
2.-name pattern: 不区分文件名的大小写,只支持glob风格的查找文件:*,?,[],[^]
3.-regex pattern:基于正则表达式查找文件,精确匹配文件名

二、以文件从属关系查找

1
2
3
4
5
6
1.-user USERNAME:以用户名查找
2.-group GROUPNAME:以组名查找
3.-uid UID:以UID查找
4.-gid GID:以GID查找
5.-nouser:查找没有属主的文件
6.-nogroup:查找没有属组的文件

三、以文件类型查找

1
2
3
4
5
6
7
8
1.-type TYPE:以文件类型查找
f : 普通文件
d : 目录文件
b : 块设备文件
c : 字符设备文件
l : 连接文件
s : 套接字文件
p : 管道文件

四、根据文件大小查找

1
2
3
4
-size [+|-]SIZE : 以文件大小查询,大小包含K,M,G的单位
-size 5M : 精确查找大小为5M的文件,大小上面浮动稍微有偏差
-size -5M : 查询大小小于5M的文件
-size +5M : 查询大小大于5M的文件

五、根据时间查找

1
2
3
4
5
6
7
8
9
10
11
-atime [+|-]TIME : 以访问时间(天)查找
-mtime [+|-]TIME : 以数据修改时间(天)查找
-ctime [+|-]TIME : 以元数据修改时间(天)查找
-amin [+|-]TIME : 以访问时间(分钟)查找
-mmin [+|-]TIME : 以数据修改时间(分钟)查找
-cmin [+|-]TIME : 以元数据修改时间(分钟)查找
-newer FILE : 以FILE文件为条件,判断比它新的文件

准确时间,7表示刚好7(天|分钟)起始位置
+7: 7(天|分钟)以前的
-7: 7(天|分钟)以内的

六、根据权限查找

1
2
3
4
5
6
7
8
9
-perm MODE : 精确权限查找
find . -perm 644
-perm /MODE : 任何一类用户(u,g,o)中的任何一位(r,w,x)符合条件即满足,理解为或关系
find . -perm /222 : 查找至少有一个类用户有写权限
find . -perm /666 : 查找至少有一个类用户有读写权限
find . -perm /001 :查找其他用户有执行权限
-perm -MODE : 每一类用户(u,g,o)的权限中的每一位(r,w,x)同时符合条件即满足,理解为与关系
find . -perm -222 : 查找三类用户都有写权限
find . -not -perm -222 :至少有一类用户没有写权限

七、 组合条件测试

1
2
3
4
5
6
7
8
9
与 : -a
默认组合逻辑,可以加-a,也可以取消,例:find . -type f -a -user mariadb,两个条件同时满足

或 : -o
可以加-o参数,例:find . -type f -o -nouser ,两个条件只满足一个即可

非 : -not 或者 !表示
find . -not -type f,不是普通文件
find . ! -type f ,同上

八、处理动作

1
2
3
4
5
6
7
8
9
10
11
-print : 默认为打印,不需要添加,输出入屏幕

-ls : 以ls长文件的格式形式输出

-delete : 删除查找到的文件

-fls /PATH/TO/SOMEFILE :把查询到的文件以ls详细信息格式保存到SOMEFILE文件中

-ok COMMAND {} \; : 查找到的文件传递给COMMAND命令,提每步都给用户提示确认操作

-exec COMMAND {} \; : 查找到的文件传递给COMMAND命令,直接修改完成,不给用户确认

注意:find将查找到的文件路径一次性传递给后面的命令,但有很多的命令不能接受过长的参数,导致命令的执行失败,使用如下方式可避免此错误的发生:

1
2
find /etc -type f | xargs -i COMMAND  : -i参数是由find的结果传给xargs命令后,由-i指定结果代替符
find /etc -type f | xargs -i cp {} /tmp : -i 指定代替符为{}

##选项

一、指定查找目录范围

1
2
-maxdepth NUM : 指定最多搜索目录层级到NUM层
-mindepth NUM : 指定最少搜索目录NUM层级

二、查找空文件

1
2
-empty : 查询内容为空的文件
find ./ -empty : 查找当前目录下的所有空文件

三、排除符号连接

1
-follow : 排除符号连接

Find与xagrs的命令结合

1
2
3
4
Usage:
find /etc -type f | xargs -i cp {} /tmp/

-i : 由xargs接收的参数,由-i声名由后一个命令{}代替

示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
找出/tmp目录下属主为非root,且文件名包含fstab字符串的文件
find /tmp -not -user root -a -name *fstab*

找出/tmp目录下文件名中不包含fstab字符串的文件
find /tmp -not -name *fstab*

找出/tmp目录下属主为非root,而且文件名不包含fstab字符串的文件
find /tmp -not -user root -a -not -name *fstab*
find /tmp -not \(-user root -o -name *fstab*\)

至少有一周没有访问过的文件
find /etc -atime +7 -ls

24小时内修改过的文件
find /etc -mtime -1 -ls

查找 /var目录下属主为root,且属组为mail的所有文件或目录
find /var/ -user root -group mail

查找/usr目录下不属于root,bin,或者hadoop的所有文件或目录,用两种方法
find ./ -not -user bin -not -user user3 -not -user user4
find ./ -not \( -user bin -o -user user3 -o -user user4 \)

查找/etc目录下最近一周其内容修改过, 且属主不是root用户也不是hadoop用户的文件或目录
find /etc -mtime -7 -not -user root -not -user hadoop

查找当前系统上没有属主或属组,且最近一周内曾被访问过的文件或目录
find / -atime -7 -nouser -o -nogroup

查找/etc目录下大于1M且类型为普通文件的所有文件
find /etc/ -size +1M -type f -ls

查找/etc目录下所有用户都没有写权限的文件
find /etc/ -type f -not -perm /222 -ls

查找/etc目录至少有一类用户没有执行权限的文件
find /etc/ -not -perm -111 -ls

查找/etc/init.d目录下,所有用户都有执行权限,且其它用户有写权限的所有文件
find /etc/ -perm -111 -perm -002
find /etc/ -perm -113

摩根定律:

** !A -a !B = !(A -o B)**

** !A -o !B = !(A -a B)**