find命令
根据文件和目录名称查找
-name
\ -iname
选项为根据文件或目录名称查找文件。前者是大小写敏感,后者是忽略大小写。
例如查询当前目录以及子目录下console开头的文件或目录。
[lsms@DataTest6 log]$ find ./ -name "console*"
./console
./bak/console.log.gz
./bak/console.log.20190709
./bak/console.log
./console.log
根据文件的绝对路径查找
-path
\ ipath
表示根据文件的绝对路径查找(即路径+文件名)。比如说在当前路径下,查找匹配".bak/console*"
的路径,并且在过滤出后缀是.gz的文件。ipath表示忽略大小写。
[lsms@DataTest6 log]$ find ./ -path "./bak/console*"
./bak/console.log.gz
./bak/console.log.20190709
./bak/console.log
根据文件类型查找
-type
表示根据指定的文件类型查询。其中-type
的取值为:
d: 目录
c: 字型装置文件
b: 区块装置文件
p: 具名贮列
f: 一般文件
l: 符号连结
s: 套接字文件
例如查找当前目录下的目录:
[lsms@DataTest6 log]$ find ./ -type d
./
./console
./bak
根据文件大小查找
-size
表示根据文件大小查找文件。取值为[+-]n[cwbkMG]
,其中±表示大于等于和小于等于,n为数字,数字后边不加任何值则默认为b,方括号内为计量单位,[cwbkMG]含义为:
b:for 512-byte blocks (this is the default if no suffix is used)
c:for bytes,即字节。
w:for two-byte words
k:for Kilobytes (units of 1024 bytes),即Kb。
M:for Megabytes (units of 1048576 bytes),即Mb。
G:for Gigabytes (units of 1073741824 bytes),即Gb。
例如查找当面目录下大于等于100k的文件。
[lsms@DataTest6 log]$ find ./ -size +100k
./LsmsSvc01.log
./LsmsSvc01_2019-08-15.log
./LsmsSvc01_2019-07-29.log
./bak/LsmsSvc01.log
./bak/console.log.gz
./bak/console.log.20190709
./bak/console.log
./console.log
查找空目录或文件
find ./ -empty
此命令为查询空目录或文件。
根据文件内容最后访问时间查找
-a[min|time]+|-n
表示根据文件内容访问时间查找文件。其中min表示分钟,time表示天;+n表示多少天之前,-n表示多少天之内。
根据文件内容最后修改时间查找
-m[min|time]+|-n
表示根据文件内容最后修改时间查找文件。其中min表示分钟,time表示天;+n表示多少天之前,-n表示多少天之内。
根据文件状态最后修改时间查找
这里要特别说明一下文件状态指的是文件本身,即文件属性(权限、所属组、位置、大小等等)最后被变更的时间,变更动作可以使用chmod、chgrp、mv等等。
-c[min|time]+|-n
表示根据文件内容访问时间查找文件。其中min表示分钟,time表示天;+n表示多少天之前,-n表示多少天之内。
注意:可以使用stat file
命令来查看文件的文件访问时间,内容修改时间和属性修改时间。
根据目录曾经查找文件
--maxdepth LEVELS
:最大目录层级
--mindepth LEVELS
:最小目录层级
例如:
查询以"z"开头文件和目录在第二层目录中。
find -maxdepth 2 -name "z*"
查询以"z"开头文件和目录在第二和第四层目录中。
find -mindepth 2 -maxdepth 4 -name "z*"
逻辑运算符
逻辑运算符主要有以下几个,按照优先级从高到低的顺序如下:
(expr):括号优先级最高,首先对括号内的求值
!expr:对expr表达式的值取反。-not expr含义相同。
expr1 expr2:不加任何运算符,相当于两个之间加and,即与运算。expr1 -a expr2、expr1 -and expr2含义相同。
expr1 -o expr2:表示对expr1和expr2两个表达式的值求或,expr1 -or expr2含义相同。
expr1,expr2
示例1:输入log目录下所有非.log的文件。因为是做的or运算,非.log为false,才进行-print的运算。
find ./ -name "*.log" -o -print
示例2:查找log目录文件大于等于500k或以.log结尾的文件。
find ./ -size +500k -or -name "*.log"
示例2:查找log目录下*.log.gz结尾并且大小等于100k的文件。
find ./ \( -name "*.log.gz" \) -and \( -size +100k \)
注意:()需要使用\转移,并且(前后需要有空格,否则会报语法错误。
关于文件的访问时间、内容修改时间和文件属性修改时间的参考资料:
https://www.cnblogs.com/kerrycode/archive/2019/02/27/10441997.html
https://blog.youkuaiyun.com/qq_31828515/article/details/62886112
参考资料:
https://www.cnblogs.com/davidwang456/p/3753707.html
https://www.runoob.com/linux/linux-comm-find.html