find 基于路径查找。如果使用find命令,不设置任何参数,则find命令将在当前目录下查找子目录与文件。并且将查到的子目录和文件全部进行显示。

语法:find [查找路径] [查找条件] [对查找完后对查找的结果做一些处理]

[查找条件]:

1)-name  --基于文件名查找

例子:

例1、查找/目录下,名字为“ifcfg-eth0”的文件

[root@oldboyedu ~]# find / -name "ifcfg-eth0"

例2、查找/etc目录下,名字后缀为“.conf”的文件

[root@oldboyedu ~]# find /etc -name "*.conf"

2)-type b/c/d/p/f/l/s  --基于类型查找

    b  --块设备(硬盘)

    c  --字符型设备

    d  --目录文件

    p  --管道设备

    f  --普通文件

    l  --符号链接

    s  --套接字类型

例子:

例1、查找/etc目录下的普通文件

[root@oldboyedu ~]# find /etc -type f

例2、查找/目录下的目录文件

[root@oldboyedu ~]# find /oldboy -type d

例3、查找/var/目录下的管道文件

[root@oldboyedu ~]# find /var -type p

例4、查找/dev目录下的块设备文件

[root@oldboyedu ~]# find /dev -type b

例5、查找/dev目录下的字符设备文件

[root@oldboyedu ~]# find /dev -type c

例6、查找/usr/sbin目录下的链接文件

[root@oldboyedu ~]# find /usr/sbin -type l

例7、查找/var/run目录下的套接字文件

[root@oldboyedu ~]# find /var/run -type s

3)-user -group  --基于用户和组

例子:

例1、查找/home目录下,拥有者为oldboy的文件

[root@oldboyedu ~]# find /home/ -user oldboy
/home/oldboy
/home/oldboy/tools
/home/oldboy/.bash_history
/home/oldboy/.bash_logout
/home/oldboy/.bash_profile
/home/oldboy/.bashrc

例2、查找/home目录下,所属组为oldboy的文件

[root@oldboyedu ~]# find /home/ -group oldboy
/home/oldboy
/home/oldboy/tools
/home/oldboy/.bash_history
/home/oldboy/.bash_logout
/home/oldboy/.bash_profile
/home/oldboy/.bashrc

4)按时间查找:

①以天为单位

-atime n

-ctime n

-mtime n

②以分钟为单位

-amin n

-cmin n

-mmin n

wKiom1evJU6yBIWJAABE3TDDGQ0186.png

n为数字,n前可以有+或者-号:

+n:n+1天前

n:n到n+1天之间

-n:n天以内

文件的时间:

atime:访问时间,cat more less

ctime:文件的属性发生变化的时间,比如:权限 所有者大小

mtime:文件的内容发生变化的时间

例子:

例1、查找/oldboy目录下,24小时内被修改的文件

[root@oldboyedu ~]# find /oldboy -mtime 0

例2、查找/oldboy目录下,48小时内被修改的文件

[root@oldboyedu ~]# find /oldboy -mtime -2

例3、查找/oldboy目录下,72小时以前被修改的文件

[root@oldboyedu ~]# find /oldboy -mtime +2

例4、查找/oldboy目录下,5分钟以内被修改的文件

[root@oldboyedu ~]# find /oldboy -mmin -5

5)-perm  --基于权限查找

①精确查找

例1、查找/oldboy目录下,所属组权限只有r权限的文件

[root@oldboyedu ~]# find /oldboy -perm g=r

②模糊查找

例1、查找/oldboy目录下,任意权限上有x权限

[root@oldboyedu ~]# find /oldboy -perm +111

例2、查找/oldboy目录下,保证每个权限位上有x的文件

[root@oldboyedu ~]# find /oldboy -perm -111

当权限值只有一个有效值的时候,+和-结果是一样的(如:+100 -100)

6)-size  基于文件的大小查找(c:字节 k:千字节 M:兆字节 G:GB字节)

①精确查找:

例1、查找/oldboy目录下文件大小,等于4M的文件

[root@oldboyedu ~]# find /oldboy -size 4M

②模糊查找:

例1、查找/oldboy目录下,文件大小,大于3M的文件

[root@oldboyedu ~]# find /oldboy -size +3M

例2、查找/oldboy目录下,文件大小,小于3M的文件

[root@oldboyedu ~]# find /oldboy -size -3M

7)基于多条件查找:

-and (-a) 

-o     

-not (!) 

例子:

例1、查找/oldboy目录下,文件大小小于3M和大于1M的文件

[root@oldboyedu ~]# find /oldboy -size -3M -a -size +1M

例2、查找/oldboy目录下,文件大小等于3M或者大小等于4M的文件

[root@oldboyedu ~]# find /oldboy -size 3M -o -size 4M

例3、查找/oldboy目录下,文件大小小于3M并且所属组不是root的文件

[root@oldboyedu ~]# find /oldboy -size -3M -not -group root

[对查找完后对查找的结果做一些处理]:

1)-exec command {} \;  --将查到的文件执行command操作,“{}” 表示当前find查找出来的内容,“\;”表示结束,“{}” 和“\;”之间有空格      

例子:

例1.查找/oldboy目录下,名字后缀为“.txt”的普通文件,并且删除

[root@oldboyedu ~]#ls -l /oldboy/  -- -l
以长格式显示文件信息,下面的显示开头是“d”的表示目录,开头是“-”的表示文件
total 8
drwxr-xr-x 2 root root 4096 Aug 12 12:25 abc
drwxr-xr-x 2 root root 4096 Aug 12 13:20 data
-rw-r--r-- 1 root root   0 Aug 12 14:26 file1.txt
-rw-r--r-- 1 root root  0 Aug 12 14:26 file2.txt
-rw-r--r-- 1 root root  0 Aug 12 14:26 file3.txt
-rw-r--r-- 1 root root  0 Aug 12 14:26 file4.txt
-rw-r--r-- 1 root root  0 Aug 12 14:26 file5.txt
[root@oldboyedu ~]# find /oldboy -name "*.txt" -type f -exec rm{} \;
[root@oldboyedu ~]# ls -l /oldboy/
total 8
drwxr-xr-x 2 root root 4096 Aug 12 12:25abc
drwxr-xr-x 2 root root 4096 Aug 12 13:20data

2)管道符加xargs命令(|xargs)

例子:

例1.查找/oldboy目录下,名字后缀为“.txt”的普通文件,并且删除

[root@oldboyedu ~]# find /oldboy -name "*.txt" -type f|xargs rm -f
[root@oldboyedu ~]# ls -l /oldboy/
total 8
drwxr-xr-x 2 root root 4096 Aug 12 12:25abc
drwxr-xr-x 2 root root 4096 Aug 12 13:20data

提示:

find命令自带的参数-exec和系统命令xargs命令有什么区别?

-exec和xargs都做了相同的工作,结果也是相同的,但是二者在执行的过程中是有区别的:

-exec

  1)参数是一个一个传递的,传递一个参数执行一次rm

  2)文件名有空格等特殊字符也能处理

xargs

  1)一次将参数传给命令

  2)处理特殊文件名需要采用如下方式:find /oldboy -name "*.txt"|xargs -i rm {}

例子:

例1、查找/oldboy目录下,名字后缀是“.txt”的普通文件,并用echo输出文件名,xargs、xargs -i、-exec对比。

[root@oldboyedu ~]# find /oldboy -name "*.txt" -type f|xargs echo
/oldboy/file3.txt /oldboy/file1.txt  /oldboy/file2.txt/oldboy/file5.txt /oldboy/file4.txt
[root@oldboyedu oldboy]# find /oldboy -name "*.txt" -type f|xargs -i echo {}
/oldboy/file3.txt
/oldboy/file1.txt
/oldboy/file2.txt
/oldboy/file5.txt
/oldboy/file4.txt
[root@oldboyedu ~]# find /oldboy -name "*.txt" -type f -exec echo {} \;
/oldboy/file3.txt
/oldboy/file1.txt
/oldboy/file2.txt
/oldboy/file5.txt
/oldboy/file4.txt

日常工作中推荐使用xargs,高效,减少磁盘IO!