![给安全工程师讲透Linux](https://wfqqreader-1252317822.image.myqcloud.com/cover/874/48593874/b_48593874.jpg)
1.4.4 利用find命令执行更强大的搜索
find命令是非常强大而灵活的搜索工具。它能够在任何指定目录中进行搜索,并查找众多不同的参数,其中当然包括文件名称,还包括创建或修改日期、所有者、群组、权限以及大小。
以下是find命令的基本用法:
![](https://epubservercos.yuewen.com/FF643F/28235156504825006/epubprivate/OEBPS/Images/36_02.jpg?sign=1738930605-4WBSS8TTchh4TQ89qMXV2DYQAFygpRlK-0-30d2e8c5dca1c09a03f566d484315054)
因此,如果想要从根目录开始搜索一个名为apache2(开源网络服务器)的文件,那么应该进行如下输入:
![](https://epubservercos.yuewen.com/FF643F/28235156504825006/epubprivate/OEBPS/Images/36_03.jpg?sign=1738930605-nHgaRMRVp8qEDND2znJ0so2c3SbE0ILe-0-4767e9d3887b76b086f8e65ea45de997)
首先声明要开始搜索的目录,在本例中是/➊。然后,指明待搜索文件的类型,在本例中f代表一个常规文件➋。最后,给定要搜索的文件名称,在本例中是apache2➌。
本次搜索的结果如下所示:
![](https://epubservercos.yuewen.com/FF643F/28235156504825006/epubprivate/OEBPS/Images/36_04.jpg?sign=1738930605-xWdtmceQXUmCqSlWTb65wMPPjj929aui-0-8734eecc0ea84f921ae05be7eaa52591)
find命令从文件系统的顶端(/)开始,遍历每个目录来查找apache2这一文件名,然后列举查找到的所有实例。
可以想象,一次遍历每个目录的搜索肯定会很慢。一种加速的方法是,只在预计能够找到所需文件的目录中进行遍历。在这种情况下,如果想要寻找一个配置文件,那么我们可以直接在/etc目录中进行搜索,这样Linux系统只会搜索其子目录。让我们来试一试:
![](https://epubservercos.yuewen.com/FF643F/28235156504825006/epubprivate/OEBPS/Images/36_05.jpg?sign=1738930605-Dk6ya3Xu5pcHIBIA2Vr7g3jsgGUqnLDp-0-fe6849db821ec8cce499a237084e9ffd)
![](https://epubservercos.yuewen.com/FF643F/28235156504825006/epubprivate/OEBPS/Images/37_01.jpg?sign=1738930605-Mf9g9n5OVeLvCVqyoDZl9YgxR5aAJV5s-0-5e65863dd1f375ed4fc57b3a733ab7f6)
这次明显更快的搜索只会在/etc目录及其子目录中查找apache2出现的位置。还要特别注意的是,与其他一些搜索命令不同,find命令只显示与名称严格匹配的结果。如果文件apache2有一个后缀,比如说apache.conf,那么搜索过程将不会发现一个匹配结果。我们可以通过使用通配符来突破这种限制,从而匹配多个字符。通配符主要有三种不同的形式:*、?和[]。
让我们在/etc目录中查找所有以apache2开头、带有任意后缀的文件。对此,我们可以编写一条使用如下通配符的find命令:
![](https://epubservercos.yuewen.com/FF643F/28235156504825006/epubprivate/OEBPS/Images/37_02.jpg?sign=1738930605-lVFBzv60uTnsc2JSaxdasY386iLeiicv-0-4f6bcdb91499cc250cc6f1aa5948fcce)
当这条命令运行时,我们在/etc目录中发现只有一个文件符合apache2.*的模式。当我们使用点号后跟一个*通配符时,终端会寻找在文件名apache2后带有任何后缀的文件。对于查找不知道后缀的文件,这是一种非常有用的技术。
当这条命令运行时,我在/etc目录中找到两个以apache2开头的文件,其中包括apache2.conf文件。
通配符简单介绍
假设我们正在一个包含文件cat、hat、what和bat的目录中进行搜索。通配符?被用来代表一个单独的字符,因此针对?at的搜索结果将返回hat、cat和bat,而不包括what,因为在该文件名中的at之前存在两个字母。通配符[]用于匹配出现在中括号内的字符。例如,针对[c,b]at的搜索结果将匹配cat和bat,而并不包括hat和what。使用最为广泛的通配符是星号(*),它将匹配任意长度的任意字符,包括从零到无限长度的字符。例如,针对*at的搜索结果将返回cat、hat、what和bat。