1.What is find?

          在linux当中用于文件搜索的命令主要用两个,一个是locate,另一个就是find。我们平常使用最多就是find命令,现在我们就来一步步学习find命令,刚刚接触到find命令的同学可能会觉得这个命令有些难度,不错,相比其他的一些常规命令,这个命令学习起来确实有一点点难度,主要是因为这个命令的选项和参数比较多。


2.How to use find?

          find命令的选项和参数确实比较多,所以刚刚接触的时候不要试图全部掌握,先学会一些简单使用规则,然后在实际应用中使用到它,然后再去学习更高端的规则,进而学习更多的参数和选项。

          我们先man一下find



1



2



3



4



5


NAME



find - search for files in a directory hierarchy






SYNOPSIS



find [-H] [-L] [-P] [-D debugopts] [-Olevel] [path...] [expression]




          看看这个手册就觉得这个命令好复杂,不过我们先忘掉它的复杂,从简单的开始




1



2


[root@localhost ~] # find aa -name file1 -print



aa /file1




          我们先来解释一下这个命令的执行过程:在aa目录里搜索名字是file1的文件,搜索到之后将之打印出来

          看明白这个执行过程之后就简单多了

          我们看看find命令的格式:


       find + [path] + [option] + [test] + [action]

            path:这个不用解释,就是我们想要搜索的路径


            option:这个选项是对前面的路径进行修饰的,不如常见的选项有:

搜索N层目录

不搜索其他文件系统


            test:这是学习find命令的重点,可以根据文件的各种属性来做条件判断,比如文件名,修改时间,文件的属组等等,更多的判断条件请看手册,这里的条件测试可以多个条件测试组合测试,比如文件名是aaa,而且是目录,就可以是:-name aaa -and -type d。如果多个条件测试的时候可以就是括号以确定优先级,值得注意的是,括号()在bash中是特殊字符,所以需要加\转义。


            action:这是find命令的收尾工作,当文件与我们前面指定的各种匹配测试通过之后,就说明该文件就是正是我们要寻找的文件,那么我们需要对这些文件做什么样的处理工作,就交给这个action来完成,我们列举最常用的action:

                       -print :打印,就是将搜索到的文件打印在屏幕上

                       -exec :执行一些命令,也就是说这个命令后面跟随一些命令,指定使用 \;结束,魔术字符串{}时-exec的一个特殊参数,表示前面搜索到的文件的完全路径,比如要用ls -l命令来显示搜索岛的文件:find [path] [test] -exec ls -l {} \;


3.Examples

     不能光说不练,我们来举几个例子

       先来看看我aa目录下的所有目录和文件



1



2



3



4



5



6



7



8



9



10



11



12



13



14



15



16



17



18



19


[root@localhost ~] # find aa



aa



aa /b3333



aa /b3333/cc22



aa /b3333/ccc11



aa /b3333/ccc33



aa /file3



aa /b111



aa /b111/cc22



aa /b111/ccc11



aa /b111/ccc33



aa /b222



aa /b222/cc22



aa /b222/ccc11



aa /b222/ccc33



aa /file1



aa /file2



aa /_file



[root@localhost ~] #




            再来看看这里面普通文件



1



2



3



4



5



6


[root@localhost ~] # find aa -type f



aa /file3



aa /file1



aa /file2



aa /_file



[root@localhost ~] #




            我们新建两个文件test,_test,那么我们现在来查找以下划线开头的文件



1



2



3



4


[root@localhost ~] # find aa -type f -and -name '_*'



aa /_test



aa /_file



[root@localhost ~] #




            由于_file文件比test文件先创建,_test文件比test文件后创建,所以我们一test文件做参考,有下划线开头,而且比test后创建的文件



1



2



3


[root@localhost ~] # find aa \( -type f -and -name '_*' -and -newer aa/test \)



aa /_test



[root@localhost ~] #




            看看上面的这条命令,有测试条件太多,所以我用了括号包起来,这样直观一些,括号是特殊字符,记得转义哦。

            我们来显示所以目录




1



2



3



4



5



6



7



8



9



10



11



12



13



14



15


[root@localhost ~] # find aa -type d



aa



aa /b3333



aa /b3333/cc22



aa /b3333/ccc11



aa /b3333/ccc33



aa /b111



aa /b111/cc22



aa /b111/ccc11



aa /b111/ccc33



aa /b222



aa /b222/cc22



aa /b222/ccc11



aa /b222/ccc33



[root@localhost ~] #




           我们现在来尝试使用最后的action,上面显示的这么多目录,我们用ls -l来显示它们的详细信息




1



2



3



4



5



6



7



8



9



10



11



12



13



14



15



16



17



18



19



20



21



22



23



24



25



26



27



28



29



30



31



32



33


[root@localhost ~] # find aa -type d -exec ls -l {} \;



total 12



-rw-r--r--. 1 root root    0 Feb 24 19:31 _file



-rw-r--r--. 1 root root    0 Feb 24 20:23 _test



drwxr-xr-x. 5 root root 4096 Feb 24 19:28 b111



drwxr-xr-x. 5 root root 4096 Feb 24 19:28 b222



drwxr-xr-x. 5 root root 4096 Feb 24 19:28 b3333



-rw-r--r--. 1 root root    0 Feb 24 19:30 file1



-rw-r--r--. 1 root root    0 Feb 24 19:31 file2



-rw-r--r--. 1 root root    0 Feb 24 19:31 file3



-rw-r--r--. 1 root root    0 Feb 24 20:23 test



total 12



drwxr-xr-x. 2 root root 4096 Feb 24 19:28 cc22



drwxr-xr-x. 2 root root 4096 Feb 24 19:28 ccc11



drwxr-xr-x. 2 root root 4096 Feb 24 19:28 ccc33



total 0



total 0



total 0



total 12



drwxr-xr-x. 2 root root 4096 Feb 24 19:28 cc22



drwxr-xr-x. 2 root root 4096 Feb 24 19:28 ccc11



drwxr-xr-x. 2 root root 4096 Feb 24 19:28 ccc33



total 0



total 0



total 0



total 12



drwxr-xr-x. 2 root root 4096 Feb 24 19:28 cc22



drwxr-xr-x. 2 root root 4096 Feb 24 19:28 ccc11



drwxr-xr-x. 2 root root 4096 Feb 24 19:28 ccc33



total 0



total 0



total 0



[root@localhost ~] #