语法
find 路径 (选项)(参数)
find之后的第一个参数是要搜索的位置。虽然可以指定特定的目录,但是大多数人使用元字符作为替代。使用这个命令的三个元字符包括:
- 句点:指定当前文件夹和所有嵌套文件夹
- 左斜杠/:指定整个文件系统
- 波浪符号~:指定活动用户的主目录
- 提示:搜索整个文件系统可能会产生许多访问拒绝错误。一般的用户账号都会遇到权限的问题,这时,应该使用提升的特权运行该命令(例如,使用sudo)。
操作符(operators)选项
操作符 | 类型 | |
| 求 | #优先级最高。为防止括号被shell解释(进入子shell),所以需要转义,即\(...\) |
| 求差集 | #对expr的true和false结果取反。同样需要使用引号包围 |
-not expr | 求差集 | #等价于"! expr" |
expr1 expr2 | 求交集 | #等同于and操作符。 |
expr1 -a expr2 | 求交集 | #等同于and操作符。 |
expr1 -and expr2 | 求交集 | #首先要求expr1为true,然后expr2以expr1搜索的结果为基础继续检测,然后再返回检测值为true的文件。因为expr2是以expr1结果为基础的,所以如果expr1返回#false,则expr2直接被忽略而不会进行任何操作 |
expr1 -o expr2 | 求并集 | #等同于or操作符 |
expr1 -or expr2 | 求并集 | #只有expr1为假时才评估expr2。 |
expr1 , expr2 | #逗号操作符表示列表的意思,expr1和expr2都会被评估,但expr1的true或false是被无视的,只有expr2的结果才是最终状态值。也就是说取最后一个表达式就行 |
TESTS选项
命令 | 命令作用类型 | 参数含义 | |||
-amin<分钟> | 文件时间 | 查找在指定时间曾被存取过的文件或目录,单位以分钟计算; | |||
-anewer<参考文件或目录> | 文件时间 | 查找其存取时间较指定文件或目录的存取时间更接近现在的文件或目录; | |||
-atime<24 小时数> | 文件时间 | 查找在指定时间曾被存取过的文件或目录,单位以 24 小时计算; | |||
-cmin<分钟> | 文件时间 | 查找在指定时间之时被更改过的文件或目录; | |||
-cnewer<参考文件或目录> | 文件时间 | 查找其更改时间较指定文件或目录的更改时间更接近现在的文件或目录; | |||
-ctime<24 小时数> | 文件时间 | 查找在指定时间之时被更改的文件或目录,单位以 24 小时计算; | |||
-daystart | 文件时间 | 从本日开始计算时间; | |||
-depth | 从指定目录下最深层的子目录开始查找; | ||||
-empty | 文件大小 | 寻找文件大小为 0 Byte 的文件,或目录下没有任何子目录或文件的空目录 | |||
-exec<执行指令> | 假设 find 指令的回传值为 True,就执行该指令; | ||||
-false | 将 find 指令的回传值皆设为 False; | ||||
-fls<列表文件> | 此参数的效果和指定 “-ls” 参数类似,但会把结果保存为指定的列表文件; | ||||
-follow | 文件类型 | 排除符号连接; | |||
-fprint<列表文件> | 此参数的效果和指定 “-print” 参数类似,但会把结果保存成指定的列表文件; | ||||
-fprint0<列表文件> | 此参数的效果和指定 “-print0” 参数类似,但会把结果保存成指定的列表文件; | ||||
-fprintf<列表文件> | <输出格式>:此参数的效果和指定 “-printf” 参数类似,但会把结果保存成指定的列表文件; | ||||
-fstype<文件系统类型> | 只寻找该文件系统类型下的文件或目录; | ||||
-gid<群组识别码> | 文件所属 | 查找符合指定之群组识别码的文件或目录; | |||
-group<群组名称> | 文件所属 | 查找符合指定之群组名称的文件或目录; | |||
-ilname<范本样式> | 此参数的效果和指定 “-lname” 参数类似,但忽略字符大小写的差别; | ||||
-iname<范本样式> | 此参数的效果和指定 “-name” 参数类似,但忽略字符大小写的差别; | ||||
-inum | 查找符合指定的 inode 编号的文件或目录; | ||||
-ipath<范本样式> | 此参数的效果和指定 “-path” 参数类似,但忽略字符大小写的差别; | ||||
-iregex<范本样式> | 此参数的效果和指定 “-regexe” 参数类似,但忽略字符大小写的差别; | ||||
-links<连接数目> | 查找符合指定的硬连接数目的文件或目录; | ||||
-iname<范本样式> | 指定字符串作为寻找符号连接的范本样式; | ||||
-ls | 假设 find 指令的回传值为 Ture,就将文件或目录名称列出到标准输出; | ||||
-maxdepth<目录层级> | 设置最大目录层级; | ||||
-mindepth<目录层级> | 设置最小目录层级; | ||||
-mmin<分钟> | 文件时间 | 查找在指定时间曾被更改过的文件或目录,单位以分钟计算; | |||
-mount | 此参数的效果和指定 “-xdev” 相同; | ||||
-mtime<24 小时数> | 文件时间 | 查找在指定时间曾被更改过的文件或目录,单位以 24 小时计算; | |||
-name<范本样式> | 文件名称 | 指定字符串作为寻找文件或目录的范本样式; | |||
-newer<参考文件或目录> | 文件时间 | 查找其更改时间较指定文件或目录的更改时间更接近现在的文件或目录; | |||
-nogroup | 文件所属 | 找出不属于本地主机群组识别码的文件或目录; | |||
-noleaf | 不去考虑目录至少需拥有两个硬连接存在; | ||||
-nouser | 文件所属 | 找出不属于本地主机用户识别码的文件或目录; | |||
-ok<执行指令> | 此参数的效果和指定 “-exec” 类似,但在执行指令之前会先询问用户,若回答 “y” 或 “Y”,则放弃执行命令; | ||||
-path<范本样式> | 指定字符串作为寻找目录的范本样式; | ||||
-perm<权限数值> | 文件权限 | 查找符合指定的权限数值的文件或目录; | model Equals模式 | 4755或rwsr-xw-x | 文件的权限必须完全相当才能被列出来 |
-model Range模式 | -0744或-rwxr--r-- | 只有文件的权限大于目标模式就行,例如4755 | |||
/model AnyOne模式 | /7000或/---s--s--t | 只要文件权限包含s或t就会被列出来 | |||
假设 find 指令的回传值为 Ture,就将文件或目录名称列出到标准输出。格式为每列一个名称,每个名称前皆有 “./” 字符串; | |||||
-print0 | 假设 find 指令的回传值为 Ture,就将文件或目录名称列出到标准输出。格式为全部的名称皆在同一行; | ||||
-printf<输出格式> | 假设 find 指令的回传值为 Ture,就将文件或目录名称列出到标准输出。格式可以自行指定; | ||||
-prune | 不寻找字符串作为寻找文件或目录的范本样式; | ||||
-regex<范本样式> | 指定字符串作为寻找文件或目录的范本样式; | ||||
-size<文件大小> | 文件大小 | 查找符合指定的文件大小的文件; | |||
-true | 将 find 指令的回传值皆设为 True; | ||||
-type<文件类型> | 文件类型 | 只寻找符合指定的文件类型的文件; | |||
-uid<用户识别码> | 文件所属 | 查找符合指定的用户识别码的文件或目录; | |||
-used<日数> | 文件时间 | 查找文件或目录被更改之后在指定时间曾被存取过的文件或目录,单位以日计算; | |||
-user<拥有者名称> | 文件所属 | 查找符和指定的拥有者名称的文件或目录; | |||
-version 或——version | 显示版本信息; | ||||
-xdev | 将范围局限在先行的文件系统中; | ||||
-xtype<文件类型> | 此参数的效果和指定 “-type” 参数类似,差别在于它针对符号连接检查。 |
actions选项(可选)
-delete | #删除文件,如果删除成功则返回true,如果删除失败,将给出错误信息。"-delete"动作隐含"-depth"。 | |
-exec command; | #注意有个分号";"结尾,该action是用于执行给定的命令。如果命令的返回状态码为0则该action返回true。 #command 后面的指令不能上别名 | |
-ok command | #类似于-exec,但在执行命令前会交互式进行询问,如果不同意,则不执行命令并返回false,如果同意,则执 #行命令,但执行的命令是从/dev/null读取输入的 | |
#总是返回true。这是默认的action,输出搜索到文件的全路径名,并尾随换行符"\n"。由于在使用"-print"时所有的结 #果都有换行符,如果直接将结果通过管道传递给管道右边的程序,应该要考虑到这一点:文件名中有空白字符(换行符、制表 #符、空格)将会被右边程序误分解,如文件"ab c.txt"将被认为是ab和c.txt两个文件,如不想被此分解影响,可考虑使 #用"-print0"替代"-print"将所有换行符替换为"\0" | ||
-print0 | #总是返回true。输出搜索到文件的全路径名,并尾随空字符"\0"。由于尾随的是空字符,所以管道传递给右边的程序,然后 #只需对这个空字符进行识别分隔就能保证文件名不会因为其中的空白字符被误分解 | |
-prune | #不进入目录,所以可用于忽略目录,但不会忽略普通文件。没有给定-depth时,总是返回true,如果给定-depth,则直接 #返回false,所以-delete(隐含了-depth)是不能和-prune一起使用的 | |
-ls | #总是返回true。将找到的文件以"ls -dils"的格式打印出来,其中文件的size部分以KB为单位 |
Options 选项
options总是返回true。除了"-daystart",options会影响所有指定的test表达式部分,哪怕是test部分写在options的前面。这是因为options是在命令行被解析完后立即处理的,而test是在检测到文件后才处理的。对于"-daystart"这个选项,它们仅仅影响写在它们后面的test部分,因此,建议将任何options部分写在expression的最前面。
命令 | 影响点 | 命令释义 |
-daystart | 属性时间 | #指定以每天的开始(凌晨零点)计算关于天的时间,用于改变时间类(-amin,-atime,-cmin,-ctime,-mmin和-mtime) #注意,该选项只会影响写在它后面的test表达式。 |
-depth | 文件处理顺序 | #搜索到目录时,先处理目录中的文件(子目录),再处理目录本身。对于"-delete"这个action,它隐含"-depth"选项 |
-maxdepth levels | #指定tests和actions作用的最大目录深度,只能为非负整数。可以简单理解为目录搜索深度,但并非如此。 当前path目录的层次为1,所以若指定-maxdepth 0将得不到任何结果。 | |
-mindepth levels | #tests和actions不会应用于小于指定深度的目录,"-mindepth 1"表示应用于所有的文件。 | |
-ignore_readdir_race | #当无法用stat检测文件信息时(如无权限)会给出下图所示的错误信息,如要忽略该信息,可以使用该选项。 |