find 指令

警告
本文最后更新于 2023-10-22,文中内容可能已过时。

find 指令

1
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. 指定查找目录范围
  • -maxdepth NUM :指定最多搜索目录层级到 NUM 层

  • -mindepth NUM :指定最少搜索目录 NUM 层级

比如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. 查找空文件 常用
  • -empty :查询内容为空的文件

    find ./ -empty:查找当前目录下的所有空文件

  1. 排除符号链接
  • -follow :排除符号链接

test 测试项

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

  1. 以文件名查找 常用
  • -name pattern:以文件名查找,支持glob风格通配符(注意:此处的文件名匹配和正则表达式是两个东西,具体区别查看《Linux 中的正则表达式》),最好用引号将文件名模式引起来,防止 shell 自己解析要匹配的字符串。而且因为是只匹配文件名,所以不能带/符号,因为文件名是不会包含/的,如果不想不区分文件名的大小写,将-name换成-iname即可

    查看隐藏文件 find . -name '.*'

  • -regex pattern:基于正则表达式查找文件,同样的,最好用引号将文件名模式引起来,此外要注意,-regex不是匹配文件名,而是匹配完整的文件名(包括路径)。如果只匹配文件名/目录名的话,一般会在正则前加上.*/。正则表达式中无法使用{},不知道为什么,TODO

  1. 以文件从属关系查找
  • -user USERNAME :以用户名查找

  • -group GROUPNAME :以组名查找

  • -uid UID :以 UID 号查找

  • -gid GID :以 GID 查找

  • -nouser :查找没有属主的文件

  • -nogroup :查找没有属组的文件

  1. 以文件类型查找,很好用

-type TYPE :以文件类型查找

  • f:普通文件 用的比较多

  • d:目录文件 用的比较多

  • b:块设备文件

  • c:字符设备文件

  • l:链接文件(指软链接,不包含硬链接)

  • s:套接字文件

  • p:管道文件

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

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

  • -size 5M :精确查找大小为 5M 的文件,大小上面浮动稍微有偏差

  • -size -5M :查询大小小于 5M 的文件

  • -size +5M :查询大小大于 5M 的文件

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

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

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

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

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

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

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

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

  • 7:准确时间,7 表示刚好 7(天 | 分钟)起始位置

  • +7:7(天 | 分钟) 以前的

  • -7:7(天 | 分钟) 以内的

  1. 根据权限查找
  • -perm MODE :精确权限查找

    find . -perm 644

  • -perm /MODE :任何一类用户 (u,g,o) 中的任何一位 (r,w,x) 符合条件即满足,理解为或关系

    find . -perm /222 :查找至少有一个类用户有写权限

    find . -perm /666 :查找至少有一个类用户有读写权限

    find . -perm /001 :查找其他用户有执行权限

  • -perm -MODE :每一类用户 (u,g,o) 的权限中的每一位 (r,w,x) 同时符合条件即满足,理解为与关系

    find . -perm -222 :查找三类用户都有写权限

    find . -not -perm -222 :至少有一类用户没有写权限

  1. 测试项组合

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

  • 与: -a 或者空格

    默认组合逻辑,可以加-a,也可以取消,例:find . -type f -a -user mariadb:两个条件同时满足

  • 或: -o

    可以加-o参数,例:find . -type f -o -nouser :两个条件只满足一个即可

  • 非: -not 或者 ! 表示

    find . -not -type f:不是普通文件

    find . ! -type f:同上

action 动作项

  • -print :默认为打印,不需要添加,输出入屏幕

  • -ls :以ls长文件的格式形式输出

  • -delete :删除查找到的文件,因为find命令会查找包括隐藏文件在内的所有文件,所以这个命令也会把隐藏文件删除,慎用

  • -fls /PATH/TO/SOMEFILE:把查询到的文件以 ls 详细信息格式保存到 SOMEFILE 文件中

  • -ok COMMAND {} \; :查找到的文件传递给 COMMAND 命令,每步都给用户提示确认操作

  • -exec COMMAND {} \; :查找到的文件传递给 COMMAND 命令,直接修改完成,不给用户确认

    注意:find将查找到的文件路径一次性传递给后面的命令,但有很多的命令不能接受过长的参数,导致命令的执行失败,使用如下方式可避免此错误的发生

    find /etc -type f | xargs -i COMMAND-i参数是由find的结果传给xargs命令后,由-i指定结果代替符。

    find source0/ -type f | xargs -i cp {} target/-i会将find传给他的一行数据用{} 代替,后面的command直接使用{}即可

    关于xargs命令,请看《xargs eXtended ARGuments》

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

常用命令

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

0%