之前我们学习了grep、sed等命令,这些命令都是用于作为文本查找的。但是Linux作为一个一切皆文件的操作系统,就需要我们知道每个文件的位置。那么多的文件不可能我们每一个都记得到它的路径,这种情况下我们就需要用到文件查找命令来查找我们需要的文件。

文件查找的命令有两种,一种是locate命令,它可以实现快速查找文件,是在全系统文件的数据库中来查找的,使用模糊匹配,结果就是出现了许多我们没有相匹配的文件。这时我们就要用到find命令来精确查找文件,find命令是遍历指定目录中的所有文件完成查找,所以说find命令的查找速度是硬伤,这是没办法改变的。
 
linux的系统是前一天晚上会自动更新系统的文件数据库,结果就是使用locate命令来查找今天创建的文件会查找不到,这种情况下我们可以用updatedb命令来手动生成文件数据库。就相当于手机里昨天的文件到了晚上会自动备份,而今天的文件我们想要查找的话就要手动去备份一下,然后才能去查看今天创建的文件。
 
find命令的使用方法为:find 查找路径 查找标准 查找后的运作查找路径默认为当前路径,查找标准默认为指定路径下的所有文件,处理运作默认为显示查找结果。
 
查找路径这个好理解,就是你要查的文件大概所处的位置。我们来说一说查找文件的匹配标准。

1、find命令的匹配标准

使用find命令的时候,find命令也支持组合条件:
-a:与
-o:或
-not:非
(1) -name 'FILENAME':对文件名做精确匹配

文件名通配:

*:任意长度的任意字符
?:任意单个字符
[]:指定范围内的任意单个字符
 
-iname 'FILENAME': 文件名匹配时不区分大小写
 
(2) -regex PATTERN:基于正则表达式进行文件名匹配
 
(3) 对于用户的属主和属组进行匹配
-user USERNAME:对属主精确匹配
-group GROUPNAME:对属组精确匹配
 
例如:
1、查找/var目录下属主为root并且属组为mail的所有文件;
find /var -user root -group mail
 
2、查找/usr目录下不属于root,bin,或student的文件;
find /usr -not -user \( root -o bin -o student \)
 
-uid UID:根据uid查找
-gid GID:根据gid查找
-nouser:查找没有属主的文件
-nogroup:查找没有属组的文件
 
例如:查找当前系统上没有属主和属组的文件
find / \( -nouser -o -group \)
 
(4) 根据文件的类型进行匹配
-type:文件类型
f:普通文件
d:目录文件
c:字符设备文件
b:块设备文件
l:连接文件
p:命令管道文件
s:套接字文件
(5) 根据文件大小进行匹配
-size:根据大小查找
[+|-]#k:    +:大于#k的文件   -:小于#k的文件
#M:
#G:
根据文件大小匹配时,匹配出来的结果会是 (#-1)M#M之间的文件,而不是#M大小的文件
 
例如:查找/etc目录下大于1M的文件,并将其文件名写入/tmp/etc.largefiles文件中;
find /etc -size +1M >> /tmp/etc.largefiles
(6)使用时间匹配文件:
-mtime:修改了的时间
-ctime:改变了的时间
-atime:访问了的时间
[+|-]#: + #天之前访问过  - #天之内访问过(用法同文件大小匹配)
 
例如:查找当前系统上没有属主或属组且最近7天内曾被访问过的文件,并将其属主属组均修改为root;
find / \( -nouser -o -group \) -a -atime -7 -exec chown root:root {} \;
 
(7) 使用文件权限来查找文件
-perm MODE:权限查找
 
/MODE:任意一位权限满足条件即可
-MODE:文件权限能完全包含此MODE时才能显示
 
例如:查找/etc目录下所有用户都没有写权限的文件,显示出其详细信息;
find /etc -not -perm /222 -ls
这条命令我们要来分析一下,/222和-222在find命令下搜索出来的文件是不一样的。/222表示只要有其中一个用户拥有写权限就可以匹配的到。-222表示只要有一个用户没有写权限就不会被匹配。而题目要求的是没有写权限的用户,前边我们加了-not,后边就要用/222而不是-222。
 

2、查找到文件后的动作

动作:
-print:显示
-ls:类似ls -l的形式显示每一个文件的详细
-ok COMMAND {} \;每一个操作都需要用户确认(查找到的文件进行ok后的COMMAND命令时每一次都要询问用户的意见)
-exec COMMAND {} \;不需要用户确认
-xargs
 
有了find命令,我们查找文件就变得方便了起来,我们还可以利用find命令来查看最近是否有用户修改了系统文件,这样就可以更好的保证我们系统的安全性。