find命令——根据路径和条件搜索指定文件

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

猜你喜欢

转载自blog.csdn.net/u013007181/article/details/129406505