一、文件查找命令find和locate对比

    在Linux中find命令是一个强大的文件查找命令,使用find查找一个文件相当方便。唯一不足的是,find命令是对指定路径下的文件实时查找,所以对系统的资源消耗较大。如果对于文件的查找不须要太精确,则可以使用locate命令。相对于find命令,locate命令则是在一个存储了文件信息的数据库中查找文件,优点是速度快,缺点是查找出来的文件可能已不存在于当前系统,并且功能没有find那么强大。

locate命令格式:

locate 文件名
#如果搜索不到文件,则可能是文件不存在或数据库还没有生成
#生成数据库可以使用命令
updatedb

find命令格式:

find [查找路径] [查找条件] [处理动作]


二、find常用参数

1、按用户查找文件

-name: 指定文件名查找,支持文件名通配符
-iname: 指定文件名查找,不区分大小写
-user: 根据文件属主查找
-group: 根据文件属组查找
#在用户被删除,但用户文件存在时使用 -user不能查找出文件,此时可以用UID
-uid: 根据UID查找
-gid: 根据GID查找
-nouser: 查找没有属主的文件
-nogroup: 查找没有属组的文件

说明:通常使用格式

find /tmp/ -name *.txt #文件名后缀是.txt的所有文件
find /tmp/ -user root #用户root的所有文件
find /tmp/ -nouser root #用户不是root的所有文件
find /tmp/ -nouser root -gid 500 #用户不是root且组ID为500的文件


2、组合条件查找

-a: 与,两边条件必须同时满足
-o: 或,两边条件有一个满足即可
-not: 非,条件取反

说明:find命令的组合条件查找看起来简单,其实挺复杂的,这里面隐含了德摩根定律的运用。

德摩根定律:

非(P 且 Q)=(非 P)或(非 Q)
非(P 或 Q)=(非 P)且(非 Q)

find组合条件的用法范例:

(1)、假如我要查找系统上/tmp/test/目录下属主为root且文件名为.txt结尾的文件。

wKioL1MRtpXzvt8rAAD8jvwYPDU874.jpg

由此可见,find命令不写组合条件默认为 -a (与)


(2)、查找系统上/tmp/test/目录下属主不为root且文件名为不以.txt结尾的文件。

当前目录所有文件:

wKioL1MRt-_DNQ0DAAFgKO6ultY388.jpg

使用find查找的三种方式:

wKioL1MRuEvyKvQNAAGqJ_SGMQ4970.jpg

第一种方式:使用-not和-a把两条件组合起来查找。

第二种方式:因为find默认为使用-a组合多条件,所以把-a去掉查找到的结果也是一样的。

第三种方式:根据伟大的德摩根定律,把两个条件的非(-not)提出来,有点类似于学校学的因式分解,-not提出来后,加上括号把两条件组合,这里要注意的是,括号要加斜线转义,并且括号里的“与”要变成“或”,如果是“或”则要变成“与”。


3、根据文件类型查找

-type: 根据文件类型查找
#以下为常用类型
    f: 普通文件
    d: 目录
    b: 块设备
    c: 字符设备
    l: 符号链接文件
    p: 命名管道
    s: 套接字文件

例如:查找/dev/目录下以sd开头的块设备文件

find /dev/ -type b -name "sd[a-z][0-9]"

wKioL1MRumnwIJXdAACCCvFLQ4g461.jpg


4、根据文件大小查找

-size: 根据文件大小查找
#常用单位: k, M, G,size后面的数字可接+|-分别代表不同意义
#例:-size +2M

说明:-size参数带加减号分别带表三种情况

-size 2M : 并不是精确查找文件大小为 2M的文件,而是表示区间是 1M-2M 大小的文件,(#-1) < x < #

-size +2M : 表示查找大于2M的文件,x > #

-size -2M : 并不是精确查找文件小于 2M的文件,而是表示区间是 0M-(2-1)M 大小的文件,0 < x < (#-1)


例如:分别新建六个以自身大小为名字后缀为.out的文件,0.out(0M)、1.5.out(1.5M)、2.out(2M)、2.5.out(2.5M)、3.out(3M)、3.5.out(3.5M)然后用这三种方式查找,结果如下:

wKioL1MRxVfQE0PCAAHzvl6VRAE350.jpg

(1)、find -size 2M: 查找的结果是两个文件,竟然还有一个1.5M的文件,这是正常的,因为此次搜索的区间是:(2-1)M < x < 2M

(2)、find -size -2M: 查找的结果是一个0k的文件,竟然没有把那个1.5M的文件搜索出来,因为此次搜索的区间是:0 < x < (2-1)M

(3)、find -size +2M: 查找出了所有大于2M的且不等于2M的文件,因为此次搜索的区间就是大于2M的文件:x > 2M


5、根据时间戳查找

#以天为单位
-atime: 查找某天范围内被访问过的文件
-mtime: 查找某天范围内被修改过的文件
-ctime: 查找某天范围内元数据被修改过的文件
#以分钟为单位
-amin: 查找某分钟范围内被访问过的文件
-mmin: 查找某分钟范围内被修改过的文件
-cmin: 查找某分钟范围内元数据被修改过的文件

说明:这六个参数也可以带加减号使用。

以-atime为例:

-atime 2: 并不是精确到2天,而是表示区间在过去2天至3一内:#天< x < (#+1)天

-atime +2: 表示的是大于2+1天访问过:x > (#+1)天

-atime -2: 表示的是2天之内:0< x < #

如下图所示:

wKioL1MR2mLgc8nhAABlAKCraWw235.jpg



6、根据权限查找

-perm: 根据某类或某个权限查找

说明:-perm可以指定u、g、o三个权限位的权限来查找文件,也可以带上加减号使用。

-perm 644: 当不带符号时,表示的是精确匹配三个权限,只处为精确匹配 644 。

-perm +644: 当带有加号时,表示的是任何一类用户的任何一位权限匹配即可,常用于查找某类用户的某特定权限是否存在。此处可以匹配:u=r|w 或者 g=r 或者 o=r

-perm -644: 表示每类用户的任何一位权限匹配,每类用户的指定要检查的权限位都匹配。此处可以匹配:644、744

如下图所示:

wKiom1MR3ueRaAqvAAGJGDC399Q137.jpg

四个文件权限分别是 a.txt(744)、b.txt(644)、c.txt(444)、d.txt(244)

(1)、find -perm 644:查找结果为精确查的644权限文件。

(2)、find -perm +644: 查找结果是所有。此处就算是200、400也能被匹配出。因此加号常用来查找某类用户的特定权限是否存在。

(3)、find -perm -644: 查找结果是 644、744


三、find命令的处理动作

常用处理动作:

-print: 打印在标准输出上
-ls: 以长格式输出各文件信息,相当于ls -l
-exec COMMAND {} \; : 对查找到的文件执行指定的命令
-ok COMMANE {} \; : 和上面的区别是,相当于交互式的-exec,对文件的执行会先询问用户;
#find把查找到的所有文件一次性地传递给 -exec 所指定的命令,命令后面接花括号作占位符,且占位符两边必须有空格,空格后接反斜线加分号。格式:-exec ls {} \;
|xargs COMMAND:把查找结果逐条传给xargs 后面的命令执行

1、find命令的默认处理动作就是-print,打印数据。

2、-ls则相当于把查找到的数据通过ls命令显示详情。

wKiom1MR5tWxbdMmAAFbZH3bdZc345.jpg


3、-exec后面接的是命令名,可以把查找到的数据传给后面的命令执行。

wKiom1MR4knxrzJTAAKthZvZ6LY828.jpg

说明:上图对查找到的文件传给后面的cat命令执行,两个花括号作占符,代表的是前面的文件的文件名,花括号后面接反斜线分号。


4、-ok和-exec是一样的,不同的是如果执行的操作是须要交互式询问用户时,-ok会在对文件执行前会先询问用户。

5、|xargs和-exec也是执行用户自定义的命令,不同的是find是把查询到的结果不管多少一次性全部传给-exec执行,而对于xargs则是逐条传递。第二个不同点是,-exec可以引用结果文件的文件名,而xargs则不可以,所以各有各的用处。

wKioL1MR5l2gtCL-AACzC0Ozrd8452.jpg