find命令的功能是根据给定的路径和条件查找文件或目录,可以使用的参数很多,并且支持正则表达式,结合管道符后能够实现更加复杂的功能,是系统管理员和普通用户日常工作必须掌握的命令之一。
find命令是对磁盘文件系统进行搜索,因此在服务器负载较高时,不建议使用find命令对整个磁盘系统进行搜索,而是使用locate命令进行模糊搜索。
find命令的语法格式如下:
find [路径] [选项] [动作]
其中:
路径指明在什么地方开始查找,比如根目录(/),或者指定目录/usr/share等。
动作主要包括以下
- -print:将找到的文件打印到屏幕,该动作是默认操作,可以省略不写。
- -delete:将找到的文件删除
- -ls:将找到的文件详细信息显示出来
- -prune:若满足条件的文件是目录,则不进入该目录查找
- -exec command:command为其它命令,比如ls及其选项,其含义是将找到结果用command命令进行处理。同时,command后面必须以【{} \;】结束。
- -ok command:与上面的-exec类似,不同的是在执行后面的command时,-exec选项不会停下来询问用户,而-ok选项会每执行一次就停下来询问一次,这对删除等破坏性操作很有好处。
常用的选项主要分成以下几类:
一、根据文件名查找
- -name:后接文件名,表示根据指定的文件名搜索,文件名可以使用通配符以进行模糊查找。
- -iname:文件名不区分大小写
示例如下:
#精确查找,默认动作为-print
[root@myEuler ~]# find /etc -name sshd_config
/etc/ssh/sshd_config
#模糊查找。指定动作为-ls
[root@myEuler ~]# find /etc -name '*.cnf' -ls
130749 4 -rw-r--r-- 1 root root 412 12月 27 17:57 /etc/pki/tls/ct_log_list.cnf
130751 12 -rw-r--r-- 1 root root 10909 12月 27 17:57 /etc/pki/tls/openssl.cnf
[root@myEuler ~]# find /etc -name '*.cnf' -exec ls -l {} \;
-rw-r--r--. 1 root root 412 12月 27 17:57 /etc/pki/tls/ct_log_list.cnf
-rw-r--r--. 1 root root 10909 12月 27 17:57 /etc/pki/tls/openssl.cnf
#文件名包括conf的是目录,则跳过不递归查找
[root@myEuler ~]# find /etc -name '*conf*' -prune
#在dir1目录中查找所有以file开头的文件,找到则删除
[root@myEuler ~]# find dir1 -name file* -ok rm -r {} \;
< rm ... dir1/file3 > ? n
< rm ... dir1/file6 > ? n
#不区分大小写
[root@myEuler ~]# find dir1 -iname file*
dir1/file1
dir1/FILE6
二、根据日期和时间查找
与日期有关的选项有-atime(访问时间)、-ctime(更改文件属性的时间)、-mtime(修改文件内容的时间),以下-mtime为例:
- -mtime N:N为整数,意为N天前的那一天内有修改过内容的文件
- -mtime +N:找出N天以前(不含第N天本身)有修改过内容的文件
- -mtime -N:找出N天以内(含N天本身)到现在有修改过内容的文件
- -newer FILE:列出比指定文件FILE还要新的文件
示例如下,假如今天是8月8日:
#找出过去24小时内文件内容有修改过的文件
[root@myEuler ~]# find /var -mtime 0
#找出8月6日那一天内文件内容有修改过的文件
[root@myEuler ~]# find /var -mtime 2
#找出8月5日及之前(包括8月5日那一天)文件内容有修改过的文件
[root@myEuler ~]# find /var -mtime +2
#找出从8月6日开始到现在有修改过文件内容的文件
[root@myEuler ~]# find /var -mtime -2
#找到比dir1/file1还要新的文件
[root@myEuler ~]# find /var -newer dir1/file1
相对应的,与时间有关的主要选项有-amin、-cmin和mmin,表示以所经历的分钟数进行搜索,下面以-cmin为例说明。
- -cmin N:N为整数,意为N分钟前的那一分钟内有修改过权限等属信的文件
- -cmin +N:找出N分钟以前(不含第N分钟本身)有修改过权限等属信的文件
- -cmin -N:找出N分免钟以内(含N分钟本身)到现在被修改过内容的文件
#在当前目录下的dir1中查找前10分钟时文件权限有修改过的文件
[root@myEuler ~]# find dir1 -cmin 10
#在当前目录下的dir1中查找10分钟以前文件权限有修改过的文件
[root@myEuler ~]# find dir1 -cmin +10
#在当前目录下的dir1中查找最近10分钟内文件权限有修改过的文件
[root@myEuler ~]# find dir1 -cmin -10
三、根据文件归属查找
与文件归属有关的常用选项如下:
- -uid N:N为整数,即用户账号的ID号(UID),表示根据文件属主的UID查找
- -gid N:N为整数,即用户组名称的ID号(GID),表示根据文件属组的GID查找
- -user username::username就是用户账号名称,表示根据文件属主名称查找
- -group groupname:groupname为用户组的名称,表示根据文件属组名称查找
- -nouser:查找文件的属主没有在/etc/passwd文件中的文件
- -nogroup:查找文件的属组没有在/etc/gpasswd文件中的文件
示例如下:
[root@myEuler ~]# find /home -user zhangsan
[root@myEuler ~]# find /home -uid 1000
#在整个文件系统中查找属主不在/etc/passwd中的文件
[root@myEuler ~]# find / -nouser
四、根据文件权限查找
与文件权限有关的选项主要有:
- -perm mode:mode为权限模式,比如权限为-rwxr--r--的对应的mode值为0744,表示查找权限刚好等于mode指定的值的文件。
- -perm -mode:查找文件权限必须全部囊括mode所表示的权限,比如-mode指定为0744,由于rwsr-xr-x囊括了rwxr--r--(0744),故拥有rwsr-xr-x权限的文件也满足要求而列出。
- -perm /mode:查找文件权限包含mode中任一模式的文件,比如要查找rwxr-xr-x,即指定/mode为/755,则权限为-rw-------的文件也满足要求,因为它包含了-rw。
用以下6个文件为例,注意观察各个文件的权限:
[root@myEuler ~]# ls -ld dir1 ; ls -l dir1
drwxr-xr-x. 2 root root 4096 3月 8 20:34 dir1
总用量 4
-rwxr--r--. 1 root root 0 3月 8 17:48 file1
-rwxr-xr-x. 1 root root 12 3月 8 17:04 file2
-rwsr-xr-x. 1 root root 0 3月 8 20:25 file3
-rw-------. 1 root root 0 3月 8 20:25 file4
-r--------. 1 root root 0 3月 8 20:33 file5
----------. 1 root root 0 3月 8 20:34 file6
1、查找文件权限刚好为0744(rwxr--r--)的文件
[root@myEuler ~]# find dir1 -perm 0744 -ls
405681 0 -rwxr--r-- 1 root root 0 3月 8 17:48 dir1/file1
2、查找囊括了0744(rwxr--r--)权限的文件
[root@myEuler ~]# find dir1 -perm -0744 -ls
404804 4 drwxr-xr-x 2 root root 4096 3月 8 20:34 dir1
405683 0 -rwsr-xr-x 1 root root 0 3月 8 20:25 dir1/file3
405682 4 -rwxr-xr-x 1 root root 12 3月 8 17:04 dir1/file2
405681 0 -rwxr--r-- 1 root root 0 3月 8 17:48 dir1/file1
3、查找包含0744(rwxr--r--)权限中任一权限位的文件
[root@myEuler ~]# find dir1 -perm /0744 -ls
404804 4 drwxr-xr-x 2 root root 4096 3月 8 20:34 dir1
405683 0 -rwsr-xr-x 1 root root 0 3月 8 20:25 dir1/file3
405682 4 -rwxr-xr-x 1 root root 12 3月 8 17:04 dir1/file2
405681 0 -rwxr--r-- 1 root root 0 3月 8 17:48 dir1/file1
405684 0 -rw------- 1 root root 0 3月 8 20:25 dir1/file4
405685 0 -r-------- 1 root root 0 3月 8 20:33 dir1/file5
五、根据文件大小查找
与文件大小有关的主要选项如下:
- -size SIZE:查找大小刚好等于SIZE的文件,单位可以是字节(c)、KB(k)、MB(M)等。
- -size +SIZE:查找大于SIZE的文件
- -size -SIZE:查找小于SIZE的文件
示例如下:
1、查找刚好等于指定大小的文件
#查找大小刚好为100字节的文件
[root@myEuler ~]# find /etc -size 100c -exec ls -lh {} \;
-rw-r--r--. 1 root root 100 11月 17 2000 /etc/sgml/sgml.conf
2、查找大于指定大小的文件
#查找大于200KB的文件
[root@myEuler ~]# find /etc -size +200k -exec ls -lh {} \;
-rw-r--r--. 1 root root 686K 7月 16 2021 /etc/services
……此处省略其它输出……
3、查找小于指定大小的文件
#查找小于100B的文件
[root@myEuler ~]# find /etc -size -10c -exec ls -l {} \;
-rw-------. 1 root root 0 3月 7 19:13 /etc/at.allow
-rw-------. 1 root root 0 3月 7 19:07 /etc/.pwd.lock
……此处省略其它输出……
六、根据文件类型查找
与文件类型有关选项主要有:
-type TYPE:这里的TYPE包括普通文件(f)、设备文件(b、c)、目录(d)、链接文件(l)、套接字(s)和管道文件(p)。
示例如下:
#查找管道文件
[root@myEuler ~]# find /run -type s
/run/gssproxy.sock
……此处省略其它输出……
#查看目录文件
[root@myEuler ~]# find /home -type d
/home
/home/zhangsan
七、使用-and、-not和-or选项优化搜索
还可以使用-and、-not和-or选项来优化搜索。某些情况下,这些选项可以帮助我们处理很多问题,例如要找到大于某个值又小于另一个值的文件,又或者找到被多个用户拥有的文件。
示例如下:
#在/shares目录查找属主是zhangsan或者lisi的文件,其中括号()要转义写成\( \)
[root@myEuler ~]# find /shares \( -user lisi -or -user zhangsan \) -ls
#查找属主是zhangsan,且大小超过1M的文件
[root@myEuler ~]# find /shares -user zhangsan -and -size +1M -ls
#查找属主是zhangsan,但属组不是zhangsan的文件
[root@myEuler ~]# find /shares -user zhangsan -not -group zhangsan -ls
以上选项还可以组合着使用,比如-name、-type和-size组合
[root@myEuler ~]# find /etc/ssh /etc/dhcp -size -2k -type f -name '*.conf' -exec ls -l {} \;
-rw-r--r--. 1 root root 831 12月 27 18:15 /etc/ssh/ssh_config.d/05-redhat.conf
-rw-r--r--. 1 root root 123 12月 27 18:14 /etc/dhcp/dhcpd.conf
-rw-r--r--. 1 root root 126 12月 27 18:14 /etc/dhcp/dhcpd6.conf