find 指令
find 指令
|
|
其中,-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 设置项
- 指定查找目录范围
-
-maxdepth NUM
:指定最多搜索目录层级到 NUM 层 -
-mindepth NUM
:指定最少搜索目录 NUM 层级
比如find -maxdepth 2 -size +2k
:在当前路径下面,最多查询两级内的 2k 以上大小的文件
-maxdepth 0
:最大目录层级为 0,表示只针对指定目录本身,比如当前目录的绝对路径为home/lk
,find . -maxdepth 0
不会查lk
下面的文件或者文件夹,只会查找lk
这一个项,所以-maxdepth 0
基本无用。
-maxdepth 1
:最大目录层级为 1,表示针对指定目录本身和指定目录下的这一层路径,比如当前目录的绝对路径为home/lk
,find . -maxdepth 1
会查lk
下面的文件,但是不会查lk
下的文件夹。
-maxdepth 2
:最大目录层级为 2,表示针对指定目录本身和指定目录下的两层路径,比如当前目录的绝对路径为home/lk
,find . -maxdepth 2
会查lk
下面的文件和文件夹,但是不会查lk
下的文件夹下的文件夹。
所以-maxdepth
一般最少指定为 1
- 查找空文件 常用
-
-empty
:查询内容为空的文件find ./ -empty
:查找当前目录下的所有空文件
- 排除符号链接
-follow
:排除符号链接
test 测试项
Linux 系统文件中常用属性为以下内容:名称,大小,权限,属主,属组,修改时间,访问时间等,我们在使用ll
命令的时候就可以看到这些结果,find
命令可以把每一项都拿来做筛选条件
- 以文件名查找 常用
-
-name pattern
:以文件名查找,支持glob
风格通配符(注意:此处的文件名匹配和正则表达式是两个东西,具体区别查看《Linux 中的正则表达式》),最好用引号将文件名模式引起来,防止 shell 自己解析要匹配的字符串。而且因为是只匹配文件名,所以不能带/
符号,因为文件名是不会包含/
的,如果不想不区分文件名的大小写,将-name
换成-iname
即可。查看隐藏文件
find . -name '.*'
。 -
-regex pattern
:基于正则表达式查找文件,同样的,最好用引号将文件名模式引起来,此外要注意,-regex
不是匹配文件名,而是匹配完整的文件名(包括路径)。如果只匹配文件名/
目录名的话,一般会在正则前加上.*/
。正则表达式中无法使用{}
,不知道为什么,TODO
- 以文件从属关系查找
-
-user USERNAME
:以用户名查找 -
-group GROUPNAME
:以组名查找 -
-uid UID
:以 UID 号查找 -
-gid GID
:以 GID 查找 -
-nouser
:查找没有属主的文件 -
-nogroup
:查找没有属组的文件
- 以文件类型查找,很好用
-type TYPE
:以文件类型查找
-
f:普通文件 用的比较多
-
d:目录文件 用的比较多
-
b:块设备文件
-
c:字符设备文件
-
l:链接文件(指软链接,不包含硬链接)
-
s:套接字文件
-
p:管道文件
- 根据文件大小查找,很好用
-size [+|-]SIZE
:以文件大小查询,大小包含 k(小写),M,G 的单位
-
-size 5M
:精确查找大小为 5M 的文件,大小上面浮动稍微有偏差 -
-size -5M
:查询大小小于 5M 的文件 -
-size +5M
:查询大小大于 5M 的文件
- 根据时间查找,用的不多
-atime [+|-]TIME
:以访问时间(天)查找
-mtime [+|-]TIME
:以数据修改时间(天)查找
-ctime [+|-]TIME
:以元数据修改时间(天)查找
-amin [+|-]TIME
:以访问时间(分钟)查找
-mmin [+|-]TIME
:以数据修改时间(分钟)查找
-cmin [+|-]TIME
:以元数据修改时间(分钟)查找
-newer FILE
:以 FILE 文件为条件,判断比它新的文件
-
7:准确时间,7 表示刚好 7(天 | 分钟)起始位置
-
+7:7(天 | 分钟) 以前的
-
-7:7(天 | 分钟) 以内的
- 根据权限查找
-
-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
:至少有一类用户没有写权限
- 测试项组合
以上这些测试项都可以组合在一起: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 './[^/\.]+'
:查看当前目录(不递归)下的文件夹