find 指令

find 指令

find [-H] [-L] [-P] [path...] [expression]

其中,-H-L-P 三个选项主要是用来处理符号链接,-H 表示只跟随命令行中指定的符号链接,-L 表示跟随所有的符号链接,-P 是默认的选项,表示不跟随符号链接。这里不过多深究。

格式中的 [path...] 部分表示 find 名称查找的目录,如果没有就是当前目录,在命令列上第一个 -(),! 之前的部份为 path,之后的是 expression默认就是递归查找,会查找所有的子目录中的所有文件,不受文件是否是隐藏文件影响

格式中的 [expression] 是一个表达式。最基本的表达式分为三类:设置项 (option)、测试项 (test)、动作项 (action),这三类又可以通过逻辑运算符 (operator) 组合在一起形成更大更复杂的表达式。设置项(如 -depth,-maxdepth 等)针对这次查找任务,而不是仅仅针对某一个文件,设置项总是返回 true;测试项 (test) 则不同,它针对具体的一个文件进行匹配测试,如 -name,-num,-user 等,返回 true 或者 false;动作项 (action) 则是对某一个文件进行某种动作(最常见的如 -print),返回 true 或者 false。

find 的执行顺序是,递归遍历所指定的目录树,针对每个文件依次执行 find 命令中的表达式,表达式首先根据逻辑运算符进行结合,然后依次从左至右对表达式求值。把这个理解了,需要什么功能查一下 man 就可以了。

option 设置项

  1. 指定查找目录范围

比如 find -maxdepth 2 -size +2k:在当前路径下面,最多查询两级内的 2k 以上大小的文件

-maxdepth 0:最大目录层级为 0,表示只针对指定目录本身,比如当前目录的绝对路径为 home/lkfind . -maxdepth 0 不会查 lk 下面的文件或者文件夹,只会查找 lk 这一个项,所以 -maxdepth 0 基本无用。

-maxdepth 1:最大目录层级为 1,表示针对指定目录本身和指定目录下的这一层路径,比如当前目录的绝对路径为 home/lkfind . -maxdepth 1 会查 lk 下面的文件,但是不会查 lk 下的文件夹

-maxdepth 2:最大目录层级为 2,表示针对指定目录本身和指定目录下的两层路径,比如当前目录的绝对路径为 home/lkfind . -maxdepth 2 会查 lk 下面的文件和文件夹,但是不会查 lk 下的文件夹下的文件夹

所以 -maxdepth 一般最少指定为 1

  1. 查找空文件 常用
  1. 排除符号链接

test 测试项

Linux 系统文件中常用属性为以下内容:名称,大小,权限,属主,属组,修改时间,访问时间等,我们在使用 ll 命令的时候就可以看到这些结果,find 命令可以把每一项都拿来做筛选条件

  1. 以文件名查找 常用
  1. 以文件从属关系查找
  1. 以文件类型查找,很好用

-type TYPE :以文件类型查找

  1. 根据文件大小查找,很好用

-size [+|-]SIZE :以文件大小查询,大小包含 k(小写),M,G 的单位

  1. 根据时间查找,用的不多

-atime [+|-]TIME :以访问时间(天)查找

-mtime [+|-]TIME :以数据修改时间(天)查找

-ctime [+|-]TIME :以元数据修改时间(天)查找

-amin [+|-]TIME :以访问时间(分钟)查找

-mmin [+|-]TIME :以数据修改时间(分钟)查找

-cmin [+|-]TIME :以元数据修改时间(分钟)查找

-newer FILE :以 FILE 文件为条件,判断比它新的文件

  1. 根据权限查找
  1. 测试项组合

以上这些测试项都可以组合在一起find path expression0 组合 expression1组合 expression2.......

action 动作项

大多数情况下,不是使用 action 动作项表达式,而是和 | xargs -i 的配合,

常用命令

find -regex './[^/\.]+':查看当前目录(不递归)下的文件夹