find命令用于在指定目录中按照tests测试条件搜索符合tests测试条件的文件

概要

命令的方式如下:

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

第一次见到该命令的人可能会被其复杂繁杂的选项参数吓到。虽然在日常开发中,很多选项并不多见。所以上述命令格式可以简化如下:

find [path...] [expression]

Path

即为查找文件的路径,命令将在指定目录及其子目录下进行查找文件,默认为当前路径

Expression

表达式,由option选项、test测试条件、action动作组成。option选项,均返回true。test测试条件即为当前文件的判断条件,其返回true/false;action动作是作用于当前文件的动作,其同样返回true/false。

若果在表达式中不仅-prune外无其他action。则默认对整个表达式结果为true的文件执行-print动作,而不是直接在前面添加-print。示例如下:

linux查找文件名命令_linux命令行查找文件_查找文件的linux命令

操作符

一般在表达式会包含多个option、test、action,如下代码code1处所示。当未显式指定操作符时,默认为”-a”(即AND)操作符,故其命令的完整方式为code2处所示

find . -path './subTest' -iname "sub*";     # code 1
find . -path './subTest' -a -iname "sub*";  # code 2

常用操作符如下:

示例如下:

linux命令行查找文件_linux查找文件名命令_查找文件的linux命令

Tests测试条件

在日常开发中,tests测试条件最为常用linux主机,现对常用的测试筛选项进行介绍:

按照文件名查找文件

按照文件名来查找文件,这也是日常最常用的:

-name     # 大小写敏感
-iname    # 大小写不敏感

其中,文件名参数可以使用Linux的文件名键值,注意其不是正则

linux查找文件名命令_linux命令行查找文件_查找文件的linux命令

按照文件权限

按照文件(Linux下,目录也属于文件)权限来筛选文件,其有3种匹配模式

    -perm num       # 严格匹配所给权限
    -perm -num      # 满足所给全部权限即可
    -perm /num      # 满足所给任一权限位即可

其将严格匹配所给权限的0和1设置,即结果文件的权限码必须和给定权限码num完全一致

-perm num

linux查找文件名命令_linux命令行查找文件_查找文件的linux命令

对于给定权限码num,文件全部满足给定的权限位即可,对于多余的权限位并不敏感

-perm -num

linux查找文件名命令_linux命令行查找文件_查找文件的linux命令

对于给定权限码num,文件若存在任一一个满足给定的权限位即可,对于多余的权限位并不敏感

-perm /num

linux命令行查找文件_查找文件的linux命令_linux查找文件名命令

linux查找文件名命令_查找文件的linux命令_linux命令行查找文件

排除某个目录

查找文件时,假若早已晓得某个目录下不存在我们所需文件,可以在find手指定排除,以免浪费时间搜索。下列命令中的-pathtest条件拿来判断是否存在指定路径。假如是,则其返回true,并按照逻辑与的漏电求值策略继续执行-pruneaction动作,用于排除该路径

    -path pathName -prune
    -path pathName -a -prune

1处查看检索当前目录下所有的内容,而2处则是查看除subTest目录外的文件

linux查找文件名命令_linux命令行查找文件_查找文件的linux命令

相信这儿会让人困惑的地方在于-print上面的-o或操作符,依据前文所述,-path./subTest-a-prune用于排除指定目录,之后-print是查看剩下的文件,中间应当是用-a与操作符来联接啊。好,那我们先将前面代码中的-o-print改为-a-print。来瞧瞧会发生哪些

linux命令行查找文件_linux查找文件名命令_查找文件的linux命令

咦?这儿居然输出的结果是不是让人很惊讶…………竟然是我们须要排除的目录。虽然,问题是在于我们没有理清find命令的执行逻辑,find是对path下的所有文件(目录文件夹也是文件的一种)依次去执行表达式linux查找文件名命令,按照test条件的结果来判断是否执行action。对于本例而言,当对subTest目录进行判断时,-path./subTest测试条件结果肯定为true,之后执行-prune以不对该目录下的文件进行遍历搜索测试,其是一个action且结果恒为真。假如此时前面假如是-a-print,则对当前测试的文件(即,subTest目录)执行复印动作,而遍历其他文件(例如,bers文件)进行测试时,-path./subTest测试条件结果为false,按照漏电求值策略,均不会执行-prune动作和-print动作,故最终我们看见的输出结果,只有./subTest目录文件;同理,假如旁边是-o-print的话linux查找文件名命令,测试./subTest目录文件时,-path./subTest-prune结果为true,因为前面是-o与操作符,按照漏电求值策略,其将不会执行-print动作,而遍历其他文件(例如,bers文件)进行测试时,-path./subTest测试条件结果为false,按照漏电求值策略,其将不会执行-prune动作,且-path./subTest-prune结果为false。而对于-print动作而言,因为其后面为-o或操作符linux删除文件夹,将会执行-print动作,即复印当前测试文件(例如,bers文件)

按名查找并排除指定目录

查找文件的linux命令_linux命令行查找文件_linux查找文件名命令

linux命令行查找文件_查找文件的linux命令_linux查找文件名命令

-a、-o优先级

如前文所述,-a与操作符优先级低于-o或操作符优先级。所以假如不注意这点,很容易会形成Bug。比如,我们期望找到名为bers或numbers.txt文件,代码如下:

linux查找文件名命令_查找文件的linux命令_linux命令行查找文件

从上文执行的结果,可以看见没有成功查找出bers文件,缘由很简单,因为-a优先级比-o高,-print动作只会在-iname'numbers.txt'测试条件返回true时执行。所以上述命令等价于右图所示

同理,虽然将numbers.txt换为一个不存在的文件名abc,也同样不会输出存在的bers文件

查找文件的linux命令_linux查找文件名命令_linux命令行查找文件

所以,对于该问题,须要通过添加括弧来改变操作符的默认优先级,使其满足我们的需求

linux命令行查找文件_查找文件的linux命令_linux查找文件名命令

Author

这篇优质的内容由TA贡献而来

刘遄

《Linux就该这么学》书籍作者,RHCA认证架构师,教育学(计算机专业硕士)。

发表回复